diff --git a/bootloader/Makefile b/bootloader/Makefile
deleted file mode 100644
index a209e35..0000000
--- a/bootloader/Makefile
+++ /dev/null
@@ -1,39 +0,0 @@
-AARCH64_TOOLCHAIN=GCC49
-EDK2_DIR=$(ANDROID_BUILD_TOP)/device/linaro/bootloader/edk2
-UEFI_TOOLS_DIR=$(ANDROID_BUILD_TOP)/device/linaro/hikey/uefi-tools
-ATF_DIR=$(ANDROID_BUILD_TOP)/device/linaro/bootloader/arm-trusted-firmware
-PRODUCT_OUT?=out/target/product/hikey
-DIST_DIR?=$(ANDROID_BUILD_TOP)/out/dist
-
-ifdef DEBUG
-	TARGET = DEBUG
-else
-	TARGET = RELEASE
-endif
-
-all: $(DIST_DIR)/fip.bin $(DIST_DIR)/l-loader.bin
-
-$(DIST_DIR)/fip.bin:
-	cd $(EDK2_DIR) && \
-	rm -rf Conf/tools_def.txt Conf/BuildEnv.sh  Conf/build_rule.txt Conf/target.txt  Conf/tools_def.txt && \
-	export CROSS_COMPILE_32=arm-linux-androideabi- && \
-	export CROSS_COMPILE_64=aarch64-linux-android- && \
-	rm -rf OpenPlatformPkg && \
-	ln -sf  $(EDK2_DIR)/../OpenPlatformPkg OpenPlatformPkg && \
-	rm -rf $(EDK2_DIR)/Build/  && \
-	mkdir -p $(EDK2_DIR)/Build/ && \
-	mkdir -p $(DIST_DIR) && \
-	mkdir -p $(ANDROID_BUILD_TOP)/$(PRODUCT_OUT)/obj/uefi && \
-	ln -sf $(ANDROID_BUILD_TOP)/$(PRODUCT_OUT)/obj/uefi $(EDK2_DIR)/Build/HiKey && \
-	$(UEFI_TOOLS_DIR)/uefi-build.sh -b $(TARGET) -D EDK2_OUT_DIR=$(ANDROID_BUILD_TOP)/$(PRODUCT_OUT)/obj/uefi -a $(ATF_DIR) hikey && \
-	cp $(EDK2_DIR)/Build/HiKey/$(TARGET)_GCC49/FV/fip.bin $(DIST_DIR)/
-
-$(DIST_DIR)/l-loader.bin: $(DIST_DIR)/fip.bin
-	cd $(ANDROID_BUILD_TOP)/device/linaro/hikey/l-loader && \
-	ln -sf $(EDK2_DIR)/Build/HiKey/$(TARGET)_GCC49/FV//bl1.bin && \
-	make CROSS_COMPILE=arm-linux-androideabi- hikey && \
-	mv l-loader.bin $(DIST_DIR)/
-
-clean:
-	rm -rf $(DIST_DIR)/fip.bin $(DIST_DIR)/l-loader.bin $(ANDROID_BUILD_TOP)/$(PRODUCT_OUT)/obj/uefi $(EDK2_DIR)/Build/HiKey
-	cd $(EDK2_DIR)/BaseTools && make clean
diff --git a/bootloader/README.md b/bootloader/README.md
deleted file mode 100644
index 1271cfd..0000000
--- a/bootloader/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-Bootloader is build with ArmTF and UEFI from sources located at:
-  device/linaro/bootloader
-To build fip.bin and l-loader.bin do:
-  $ cd device/linaro/hikey/bootloader
-  $ make
-Results will be in out/dist
-
-We can also generate ptable (needs root privilege) with below commands:
-  $ cd device/linaro/hikey/l-loader/
-  $ make ptable.img
diff --git a/device-common.mk b/device-common.mk
index f69cc5b..0721f01 100644
--- a/device-common.mk
+++ b/device-common.mk
@@ -28,6 +28,7 @@
 else
 # Adjust the dalvik heap to be appropriate for a tablet.
 $(call inherit-product, frameworks/native/build/tablet-10in-xhdpi-2048-dalvik-heap.mk)
+$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk)
 endif
 
 # Set vendor kernel path
diff --git a/hifi/xaf/hifi-dpf/audio/xa-class-audio-codec.c b/hifi/xaf/hifi-dpf/audio/xa-class-audio-codec.c
index 3806548..ce233f0 100644
--- a/hifi/xaf/hifi-dpf/audio/xa-class-audio-codec.c
+++ b/hifi/xaf/hifi-dpf/audio/xa-class-audio-codec.c
@@ -160,7 +160,7 @@
 {
     XAAudioCodec   *codec = (XAAudioCodec *) base;
 
-    /* ...make sure the port is sane */
+    /* ...make sure the port is valid */
     XF_CHK_ERR(XF_MSG_DST_PORT(m->id) == 0, XA_API_FATAL_INVALID_CMD);
 
     /* ...command is allowed only in post-init state */
@@ -202,7 +202,7 @@
 {
     XAAudioCodec   *codec = (XAAudioCodec *) base;
 
-    /* ...make sure the port is sane */
+    /* ...make sure the port is valid */
     XF_CHK_ERR(XF_MSG_DST_PORT(m->id) == 1, XA_API_FATAL_INVALID_CMD);
 
     /* ...command is allowed only in postinit state */
diff --git a/hifi/xaf/hifi-dpf/audio/xa-class-base.c b/hifi/xaf/hifi-dpf/audio/xa-class-base.c
index 0b67255..ef1110e 100644
--- a/hifi/xaf/hifi-dpf/audio/xa-class-base.c
+++ b/hifi/xaf/hifi-dpf/audio/xa-class-base.c
@@ -118,7 +118,7 @@
             /* ...scratch memory is shared among all codecs; check its validity */
             XF_CHK_ERR(size <= XF_CFG_CODEC_SCRATCHMEM_SIZE, XA_API_FATAL_MEM_ALLOC);
 
-            /* ...make sure alignment is sane */
+            /* ...make sure alignment is valid */
             XF_CHK_ERR((XF_CFG_CODEC_SCRATCHMEM_ALIGN & (align - 1)) == 0, XA_API_FATAL_MEM_ALIGN);
 
             /* ...set the scratch memory pointer */
@@ -172,7 +172,7 @@
     /* ...calculate total amount of parameters */
     n = m->length / sizeof(*param);
 
-    /* ...check the message length is sane */
+    /* ...check the message length is valid */
     XF_CHK_ERR(m->length == XF_SET_PARAM_CMD_LEN(n), XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...apply all parameters; pass to codec-specific function */
@@ -506,7 +506,7 @@
 {
     XACodecBase    *base;
 
-    /* ...make sure the size is sane */
+    /* ...make sure the size is valid */
     XF_CHK_ERR(size >= sizeof(XACodecBase), NULL);
     
     /* ...allocate local memory for codec structure */
diff --git a/hifi/xaf/hifi-dpf/audio/xa-class-mixer.c b/hifi/xaf/hifi-dpf/audio/xa-class-mixer.c
index ac2ff9a..47b4740 100644
--- a/hifi/xaf/hifi-dpf/audio/xa-class-mixer.c
+++ b/hifi/xaf/hifi-dpf/audio/xa-class-mixer.c
@@ -505,7 +505,7 @@
     {
         XATrack    *track = &mixer->track[idx];
 
-        /* ...input buffer allocation; check track number is sane */
+        /* ...input buffer allocation; check track number is valid */
         XF_CHK_ERR(idx < XA_MIXER_MAX_TRACK_NUMBER, XA_API_FATAL_INVALID_CMD_TYPE);
 
         /* ...create input port for a track */
diff --git a/hifi/xaf/hifi-dpf/core/xf-io.c b/hifi/xaf/hifi-dpf/core/xf-io.c
index 4ec415c..09f8e3e 100644
--- a/hifi/xaf/hifi-dpf/core/xf-io.c
+++ b/hifi/xaf/hifi-dpf/core/xf-io.c
@@ -540,7 +540,7 @@
     /* ...it is not permitted to access port data when port is being unrouted */
     BUG(xf_output_port_unrouting(port), _x("invalid transaction"));
 
-    /* ...make sure message length is sane */
+    /* ...make sure message length is valid */
     BUG(m->length < port->length, _x("Insufficient buffer length: %u < %u"), m->length, port->length);
         
     /* ...return access buffer pointer */
diff --git a/hifi/xaf/hifi-dpf/ipc/xt-shmem/xf-main.c b/hifi/xaf/hifi-dpf/ipc/xt-shmem/xf-main.c
index f917800..dd52bd2 100644
--- a/hifi/xaf/hifi-dpf/ipc/xt-shmem/xf-main.c
+++ b/hifi/xaf/hifi-dpf/ipc/xt-shmem/xf-main.c
@@ -181,7 +181,7 @@
     }
 #endif
 
-    /* ...enter execution loop on master core #0 */
+    /* ...enter execution loop on main core #0 */
     xf_core_loop(0);
 
     /* ...not reachable */
diff --git a/hifi/xaf/hifi-dpf/plugins/cadence/mixer/xa-mixer.c b/hifi/xaf/hifi-dpf/plugins/cadence/mixer/xa-mixer.c
index 0909d44..2191239 100644
--- a/hifi/xaf/hifi-dpf/plugins/cadence/mixer/xa-mixer.c
+++ b/hifi/xaf/hifi-dpf/plugins/cadence/mixer/xa-mixer.c
@@ -68,7 +68,7 @@
     /* ...number of bytes in input/output buffer */
     u32                 buffer_size;
     
-    /* ...master volume and individual track volumes*/
+    /* ...main volume and individual track volumes*/
     u32                 volume[XA_MIXER_MAX_TRACK_NUMBER + 1];
     
     /* ...input buffers */
@@ -116,7 +116,7 @@
     /* ...set default parameters */
     d->pcm_width = 16, d->channels = 2, d->frame_size = 512;
 
-    /* ...set default volumes (last index is a master volume)*/
+    /* ...set default volumes (last index is a main volume)*/
     for (i = 0; i <= XA_MIXER_MAX_TRACK_NUMBER; i++)
     {
         d->volume[i] = ((1 << 12) << 16) | (1 << 12);
@@ -134,7 +134,7 @@
     u32     t32;
     u32     i, j;
     
-    /* ...retrieve master volume - assume up to 24dB amplifying (4 bits) */
+    /* ...retrieve main volume - assume up to 24dB amplifying (4 bits) */
     t32 = d->volume[XA_MIXER_MAX_TRACK_NUMBER];
     w_l = (u16)(t32 & 0xFFFF), w_r = (u16)(t32 >> 16);
     
@@ -183,7 +183,7 @@
             r32 += *b[j]++ * v_r[j];
         }
 
-        /* ...normalize (truncate towards -inf) and multiply by master volume */
+        /* ...normalize (truncate towards -inf) and multiply by main volume */
         l32 = ((l32 >> 12) * w_l) >> 12;
         r32 = ((r32 >> 12) * w_r) >> 12;
 
@@ -221,7 +221,7 @@
 /* ...codec API size query */
 static XA_ERRORCODE xa_mixer_get_api_size(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...check parameters are sane */
+    /* ...check parameters are valid */
     XF_CHK_ERR(pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
     
     /* ...retrieve API structure size */
@@ -233,7 +233,7 @@
 /* ...standard codec initialization routine */
 static XA_ERRORCODE xa_mixer_init(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...sanity check - mixer must be valid */
+    /* ...validity check - mixer must be valid */
     XF_CHK_ERR(d, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...process particular initialization type */
@@ -277,7 +277,7 @@
     
     case XA_CMD_TYPE_INIT_DONE_QUERY:
     {
-        /* ...check if initialization is done; make sure pointer is sane */
+        /* ...check if initialization is done; make sure pointer is valid */
         XF_CHK_ERR(pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
         
         /* ...put current status */
@@ -298,7 +298,7 @@
 {
     u32     i_value;
     
-    /* ...sanity check - mixer pointer must be sane */
+    /* ...validity check - mixer pointer must be valid */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...pre-initialization must be completed, mixer must be idle */
@@ -336,7 +336,7 @@
 /* ...retrieve configuration parameter */
 static XA_ERRORCODE xa_mixer_get_config_param(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...sanity check - mixer must be initialized */
+    /* ...validity check - mixer must be initialized */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...make sure pre-initialization is completed */
@@ -384,7 +384,7 @@
 /* ...execution command */
 static XA_ERRORCODE xa_mixer_execute(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...sanity check - mixer must be valid */
+    /* ...validity check - mixer must be valid */
     XF_CHK_ERR(d, XA_API_FATAL_INVALID_CMD_TYPE);
     
     /* ...mixer must be in running state */
@@ -419,7 +419,7 @@
 {
     u32     size;
     
-    /* ...sanity check - check parameters */
+    /* ...validity check - check parameters */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...track index must be valid */
@@ -443,7 +443,7 @@
 /* ...get number of output bytes */
 static XA_ERRORCODE xa_mixer_get_output_bytes(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...sanity check - check parameters */
+    /* ...validity check - check parameters */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...track index must be zero */
@@ -464,7 +464,7 @@
 /* ...get number of consumed bytes */
 static XA_ERRORCODE xa_mixer_get_curidx_input_buf(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...sanity check - check parameters */
+    /* ...validity check - check parameters */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...track index must be valid */
@@ -489,7 +489,7 @@
 /* ..get total amount of data for memory tables */
 static XA_ERRORCODE xa_mixer_get_memtabs_size(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity checks */
+    /* ...basic validity checks */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...check mixer is pre-initialized */
@@ -504,7 +504,7 @@
 /* ..set memory tables pointer */
 static XA_ERRORCODE xa_mixer_set_memtabs_ptr(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity checks */
+    /* ...basic validity checks */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...check mixer is pre-initialized */
@@ -517,7 +517,7 @@
 /* ...return total amount of memory buffers */
 static XA_ERRORCODE xa_mixer_get_n_memtabs(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity checks */
+    /* ...basic validity checks */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
     
     /* ...we have N input buffers, 1 output buffer and 1 scratch buffer */
@@ -529,7 +529,7 @@
 /* ...return memory buffer data */
 static XA_ERRORCODE xa_mixer_get_mem_info_size(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity check */
+    /* ...basic validity check */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...return frame buffer minimal size only after post-initialization is done */
@@ -544,7 +544,7 @@
 /* ...return memory alignment data */
 static XA_ERRORCODE xa_mixer_get_mem_info_alignment(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity check */
+    /* ...basic validity check */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...return frame buffer minimal size only after post-initialization is done */
@@ -559,7 +559,7 @@
 /* ...return memory type data */
 static XA_ERRORCODE xa_mixer_get_mem_info_type(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity check */
+    /* ...basic validity check */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...return frame buffer minimal size only after post-initialization is done */
@@ -591,7 +591,7 @@
 /* ...set memory pointer */
 static XA_ERRORCODE xa_mixer_set_mem_ptr(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity check */
+    /* ...basic validity check */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...codec must be initialized */
@@ -658,7 +658,7 @@
 {
     XAPcmMixer    *d = (XAPcmMixer *) p_xa_module_obj;
 
-    /* ...check if command index is sane */
+    /* ...check if command index is valid */
     XF_CHK_ERR(i_cmd < XA_MIXER_API_COMMANDS_NUM, XA_API_FATAL_INVALID_CMD);
     
     /* ...see if command is defined */
diff --git a/hifi/xaf/hifi-dpf/plugins/cadence/pcm_proc/xa-pcm.c b/hifi/xaf/hifi-dpf/plugins/cadence/pcm_proc/xa-pcm.c
index 4306714..cca97ef 100644
--- a/hifi/xaf/hifi-dpf/plugins/cadence/pcm_proc/xa-pcm.c
+++ b/hifi/xaf/hifi-dpf/plugins/cadence/pcm_proc/xa-pcm.c
@@ -364,7 +364,7 @@
 /* ...standard codec initialization routine */
 static XA_ERRORCODE xa_pcm_init(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...sanity check */
+    /* ...validity check */
     XF_CHK_ERR(d, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...process particular initialization type */
@@ -437,7 +437,7 @@
 {
     WORD32      i_value;
     
-    /* ...sanity check */
+    /* ...validity check */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...configuration is allowed only in PRE-CONFIG state */
@@ -495,7 +495,7 @@
 /* ...retrieve configuration parameter */
 static XA_ERRORCODE xa_pcm_get_config_param(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...sanity check */
+    /* ...validity check */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...make sure pre-configuration is completed */
@@ -546,7 +546,7 @@
 /* ...execution command */
 static XA_ERRORCODE xa_pcm_execute(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity check */
+    /* ...basic validity check */
     XF_CHK_ERR(d, XA_API_FATAL_INVALID_CMD_TYPE);
 
    /* ...codec must be in running state */
@@ -592,7 +592,7 @@
     u32     in_stride = d->in_stride;
     u32     insize;
     
-    /* ...sanity check */
+    /* ...validity check */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...track index must be valid */
@@ -619,10 +619,10 @@
 /* ...get number of output bytes produced */
 static XA_ERRORCODE xa_pcm_get_output_bytes(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...sanity check */
+    /* ...validity check */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
-    /* ...buffer index must be sane */
+    /* ...buffer index must be valid */
     XF_CHK_ERR(i_idx == 1, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...component must be initialized */
@@ -640,7 +640,7 @@
 /* ...get number of consumed bytes */
 static XA_ERRORCODE xa_pcm_get_curidx_input_buf(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...sanity check */
+    /* ...validity check */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...index must be valid */
@@ -658,7 +658,7 @@
 /* ...end-of-stream processing */
 static XA_ERRORCODE xa_pcm_input_over(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...sanity check */
+    /* ...validity check */
     XF_CHK_ERR(d, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...put end-of-stream flag */
@@ -672,7 +672,7 @@
 /* ..get total amount of data for memory tables */
 static XA_ERRORCODE xa_pcm_get_memtabs_size(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity checks */
+    /* ...basic validity checks */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...check mixer is pre-initialized */
@@ -687,7 +687,7 @@
 /* ...return total amount of memory buffers */
 static XA_ERRORCODE xa_pcm_get_n_memtabs(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity checks */
+    /* ...basic validity checks */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
     
     /* ...we have 1 input buffer and 1 output buffer */
@@ -699,7 +699,7 @@
 /* ...return memory type data */
 static XA_ERRORCODE xa_pcm_get_mem_info_type(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity check */
+    /* ...basic validity check */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...codec must be in post-init state */
@@ -724,7 +724,7 @@
 /* ...return memory buffer size */
 static XA_ERRORCODE xa_pcm_get_mem_info_size(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity check */
+    /* ...basic validity check */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...codec must be in post-init state */
@@ -752,7 +752,7 @@
 /* ...return memory alignment data */
 static XA_ERRORCODE xa_pcm_get_mem_info_alignment(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity check */
+    /* ...basic validity check */
     XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
     /* ...codec must be in post-initialization state */
@@ -767,7 +767,7 @@
 /* ...set memory pointer */
 static XA_ERRORCODE xa_pcm_set_mem_ptr(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
 {
-    /* ...basic sanity check */
+    /* ...basic validity check */
     XF_CHK_ERR(d, XA_API_FATAL_INVALID_CMD_TYPE);
     XF_CHK_ERR(pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
 
@@ -830,7 +830,7 @@
 {
     XAPcmCodec *d = (XAPcmCodec *) p_xa_module_obj;
 
-    /* ...check if command index is sane */
+    /* ...check if command index is valid */
     XF_CHK_ERR(i_cmd < XA_PCM_API_COMMANDS_NUM, XA_API_FATAL_INVALID_CMD);
     
     /* ...see if command is defined */
diff --git a/hifi/xaf/host-apf/proxy/xf-proxy.c b/hifi/xaf/host-apf/proxy/xf-proxy.c
index 9487f4e..0af4517 100644
--- a/hifi/xaf/host-apf/proxy/xf-proxy.c
+++ b/hifi/xaf/host-apf/proxy/xf-proxy.c
@@ -451,10 +451,10 @@
     xf_route_port_msg_t    *m;
     xf_user_msg_t           msg;
     
-    /* ...sanity checks - proxy pointers are same */
+    /* ...validity checks - proxy pointers are same */
     XF_CHK_ERR(proxy == dst->proxy, -EINVAL);
     
-    /* ...buffer data is sane */
+    /* ...buffer data is valid */
     XF_CHK_ERR(num && size && xf_is_power_of_two(align), -EINVAL);
     
     /* ...get control buffer */
@@ -572,7 +572,7 @@
     /* ...unused arg */
     (void) type;
 
-    /* ...basic sanity checks; number of buffers is positive */
+    /* ...basic validity checks; number of buffers is positive */
     XF_CHK_ERR(number > 0, -EINVAL);
 
     /* ...get properly aligned buffer length */
diff --git a/hikey-common.mk b/hikey-common.mk
index aba5797..b156cc3 100644
--- a/hikey-common.mk
+++ b/hikey-common.mk
@@ -19,4 +19,3 @@
 
 $(call inherit-product, device/linaro/hikey/hikey/device-hikey.mk)
 $(call inherit-product, device/linaro/hikey/device-common.mk)
-$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk)
diff --git a/hikey960.mk b/hikey960.mk
index 22e8f6f..0107fad 100644
--- a/hikey960.mk
+++ b/hikey960.mk
@@ -23,11 +23,10 @@
 endif
 
 #
-# Inherit the full_base and device configurations
+# Inherit the common device configuration
 $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
 $(call inherit-product, device/linaro/hikey/hikey960/device-hikey960.mk)
 $(call inherit-product, device/linaro/hikey/device-common.mk)
-$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk)
 
 #setup dm-verity configs
 PRODUCT_SYSTEM_VERITY_PARTITION := /dev/block/platform/soc/ff3b0000.ufs/by-name/system
diff --git a/installer/hikey/README b/installer/hikey/README
deleted file mode 100644
index b58cd96..0000000
--- a/installer/hikey/README
+++ /dev/null
@@ -1,38 +0,0 @@
-These instruction should help you in flashing the bootloader
-and AOSP images built from sources.
-Detailed instructions on how to setup the Board can be found
-here:
-https://github.com/96boards/documentation/wiki/HiKeyGettingStarted
-
-For flashing the bootloader, the top two links should be installed
-(closed) and the 3rd link should be removed (open):
-
----------------------------------------------------------
-|	Name 		|	Link 	|	State 	|
-| Auto Power up 	|     Link 1-2 	|      closed 	|
-| Boot Select 		|     Link 3-4 	|      closed 	|
-| GPIO3-1      		|     Link 5-6 	| 	open 	|
----------------------------------------------------------
-
-Link 1-2 causes HiKey to auto-power up when power is installed. Link
-3-4 causes the HiKey SoC internal ROM to start up in at a special
-"install bootloader" mode which will install a supplied bootloader
-from the microUSB OTG port into RAM, and will present itself to a
-connected PC as a ttyUSB device.
-
-Note: The HiKey board will remain in USB load mode for 90 seconds
-from power up. If you take longer than 90 seconds to start the install
-then power cycle the board before trying again.
-
-Wait about 5 seconds and then check that the HiKey board has been
-recognized by your Linux PC:
-$ ls /dev/ttyUSB*
-or
-$ dmesg
-
-
-Run the flash-all.sh script after building AOSP for hikey with the right
-right UART recognised in the above command:
-$ ./flash-all.sh /dev/ttyUSBX [4g]
-
-Remove the link 3-4 and power on the board.
diff --git a/installer/hikey/fip.bin b/installer/hikey/fip.bin
deleted file mode 100644
index e388d9e..0000000
--- a/installer/hikey/fip.bin
+++ /dev/null
Binary files differ
diff --git a/installer/hikey/flash-all.sh b/installer/hikey/flash-all.sh
deleted file mode 100755
index 4707d06..0000000
--- a/installer/hikey/flash-all.sh
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/bin/bash
-if [ $# -eq 0 ]
-  then
-    echo "Provide the right /dev/ttyUSBX specific to recovery device"
-    exit
-fi
-
-if [ ! -e "${1}" ]
-  then
-    echo "device: ${1} does not exist"
-    exit
-fi
-DEVICE_PORT="${1}"
-PTABLE=ptable-aosp-8g.img
-if [ $# -gt 1 ]
-  then
-    if [ "${2}" == '4g' ]
-      then
-        PTABLE=ptable-aosp-4g.img
-    fi
-fi
-
-INSTALLER_DIR="`dirname ${0}`"
-FIRMWARE_DIR="${INSTALLER_DIR}"
-
-# for cases that not run "lunch hikey-userdebug"
-if [ -z "${ANDROID_BUILD_TOP}" ]; then
-    ANDROID_BUILD_TOP=${INSTALLER_DIR}/../../../../../
-    ANDROID_PRODUCT_OUT="${ANDROID_BUILD_TOP}/out/target/product/hikey"
-fi
-
-if [ -z "${DIST_DIR}" ]; then
-    DIST_DIR="${ANDROID_BUILD_TOP}"/out/dist
-fi
-
-#get out directory path
-while [ $# -ne 0 ]; do
-    case "${1}" in
-        --out) OUT_IMGDIR=${2};shift;;
-        --use-compiled-binaries) FIRMWARE_DIR="${DIST_DIR}";shift;;
-    esac
-    shift
-done
-
-if [[ "${FIRMWARE_DIR}" == "${DIST_DIR}" && ! -e "${DIST_DIR}"/fip.bin && ! -e "${DIST_DIR}"/l-loader.bin ]]; then
-    echo "No binaries found at ${DIST_DIR}. Please build the bootloader first"
-    exit
-fi
-
-if [ -z "${OUT_IMGDIR}" ]; then
-    if [ ! -z "${ANDROID_PRODUCT_OUT}" ]; then
-        OUT_IMGDIR="${ANDROID_PRODUCT_OUT}"
-    fi
-fi
-
-if [ ! -d "${OUT_IMGDIR}" ]; then
-    echo "error in locating out directory, check if it exist"
-    exit
-fi
-
-echo "android out dir:${OUT_IMGDIR}"
-
-sudo python "${INSTALLER_DIR}"/hisi-idt.py --img1="${FIRMWARE_DIR}"/l-loader.bin -d "${DEVICE_PORT}"
-sleep 3
-# set a unique serial number
-serialno=`fastboot getvar serialno 2>&1 > /dev/null`
-if [ "${serialno:10:6}" == "(null)" ]; then
-    fastboot oem serialno
-else
-    if [ "${serialno:10:15}" == "0123456789abcde" ]; then
-        fastboot oem serialno
-    fi
-fi
-fastboot getvar partition-size:ptable
-fastboot flash ptable "${INSTALLER_DIR}"/"${PTABLE}"
-fastboot flash fastboot "${FIRMWARE_DIR}"/fip.bin
-fastboot flash nvme "${INSTALLER_DIR}"/nvme.img
-fastboot flash boot "${OUT_IMGDIR}"/boot.img
-fastboot flash system "${OUT_IMGDIR}"/system.img
-fastboot flash vendor "${OUT_IMGDIR}"/vendor.img
-fastboot flash userdata "${OUT_IMGDIR}"/userdata.img
diff --git a/installer/hikey/hisi-idt.py b/installer/hikey/hisi-idt.py
deleted file mode 100644
index db66ef8..0000000
--- a/installer/hikey/hisi-idt.py
+++ /dev/null
@@ -1,263 +0,0 @@
-#!/usr/bin/env python
-#-*- coding: utf-8 -*-
-
-import os
-import os.path
-
-import serial, time
-import array
-import sys, getopt
-
-class bootdownload(object):
-    '''
-    Hisilicon boot downloader
-
-    >>> downloader = bootdownload()
-    >>> downloader.download(filename)
-
-    '''
-
-    # crctab calculated by Mark G. Mendel, Network Systems Corporation
-    crctable = [
-        0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
-        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
-        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
-        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
-        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
-        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
-        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
-        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
-        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
-        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
-        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
-        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
-        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
-        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
-        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
-        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
-        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
-        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
-        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
-        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
-        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
-        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
-        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
-        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
-        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
-        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
-        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
-        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
-        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
-        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
-        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
-        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
-    ]
-
-    startframe = {
-        'hi3716cv200':[0xFE,0x00,0xFF,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x01]
-    }
-
-    headframe = {
-        'hi3716cv200':[0xFE,0x00,0xFF,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x01]
-    }
-
-    bootheadaddress = {
-        'hi3716cv200':0xF9800800
-    }
-
-    bootdownloadaddress = {
-        'hi3716cv200':0x07000000
-    }
-
-    BOOT_HEAD_LEN = 0x4F00
-    MAX_DATA_LEN  = 0x400
-
-    def __init__(self,chiptype,serialport):
-        try:
-            self.s = serial.Serial(port=serialport, baudrate=115200, timeout=1)
-        except serial.serialutil.SerialException:
-            #no serial connection
-            self.s = None
-            print "\nFailed to open serial!", serialport
-            sys.exit(2)
-
-        self.chip = chiptype
-
-    def __del__(self):
-        if self.s != None:
-            self.s.close()
-
-    def calc_crc(self, data, crc=0):
-        for char in data:
-            crc = ((crc << 8) | ord(char)) ^ self.crctable[(crc >> 8) & 0xff]
-        for i in range(0,2):
-            crc = ((crc << 8) | 0) ^ self.crctable[(crc >> 8) & 0xff]
-        return crc & 0xffff
-
-    def getsize(self, filename):
-        st = os.stat(filename)
-        return st.st_size
-
-    def sendframe(self, data, loop):
-        for i in range(1, loop):
-            self.s.flushOutput()
-            self.s.write(data)
-            self.s.flushInput()
-            try:
-                ack = self.s.read()
-                if len(ack) == 1:
-                    if ack == chr(0xaa):
-                        return None
-            except:
-                return None
-
-        print 'failed'
-
-    def sendstartframe(self):
-	self.s.timeout = 0.01
-        data = array.array('B', self.startframe[self.chip]).tostring()
-        crc = self.calc_crc(data)
-        data += chr((crc >> 8)&0xff)
-        data += chr(crc&0xff)
-        self.sendframe(data,10000)
-
-    def sendheadframe(self,length,address):
-	self.s.timeout = 0.03
-        self.headframe[self.chip][4] = (length>>24)&0xff
-        self.headframe[self.chip][5] = (length>>16)&0xff
-        self.headframe[self.chip][6] = (length>>8)&0xff
-        self.headframe[self.chip][7] = (length)&0xff
-        self.headframe[self.chip][8] = (address>>24)&0xff
-        self.headframe[self.chip][9] = (address>>16)&0xff
-        self.headframe[self.chip][10] = (address>>8)&0xff
-        self.headframe[self.chip][11] = (address)&0xff
-
-        data = array.array('B', self.headframe[self.chip]).tostring()
-        crc = self.calc_crc(data)
-
-        data += chr((crc >> 8)&0xff)
-        data += chr(crc&0xff)
-
-        self.sendframe(data,16)
-
-
-    def senddataframe(self,seq,data):
-        self.s.timeout = 0.15
-        head = chr(0xDA)
-        head += chr(seq&0xFF)
-        head += chr((~seq)&0xFF)
-
-        data = head + data
-
-        crc = self.calc_crc(data)
-        data += chr((crc >> 8)&0xff)
-        data += chr(crc&0xff)
-
-        self.sendframe(data,32)
-
-    def sendtailframe(self,seq):
-        data = chr(0xED)
-        data += chr(seq&0xFF)
-        data += chr((~seq)&0xFF)
-        crc = self.calc_crc(data)
-        data += chr((crc >> 8)&0xff)
-        data += chr(crc&0xff)
-
-        self.sendframe(data,16)
-
-    def senddata(self, data, address):
-        length=len(data)
-        self.sendheadframe(length,address)
-        seq=1
-        while length > self.MAX_DATA_LEN:
-            self.senddataframe(seq,data[(seq-1)*self.MAX_DATA_LEN:seq*self.MAX_DATA_LEN])
-            seq = seq+1
-            length = length-self.MAX_DATA_LEN
-        self.senddataframe(seq,data[(seq-1)*self.MAX_DATA_LEN:])
-        self.sendtailframe(seq+1)
-
-
-    def download(self, filename1, filename2):
-
-        f=open(filename1,"rb")
-        data = f.read()
-        f.close()
-
-        print 'Sending', filename1, '...'
-        self.senddata(data,self.bootheadaddress[self.chip])
-        print 'Done\n'
-
-        if filename2:
-            f=open(filename2,"rb")
-            data = f.read()
-            f.close()
-
-            print 'Sending', filename2, '...'
-            self.senddata(data,self.bootdownloadaddress[self.chip])
-            print 'Done\n'
-
-
-def burnboot(chiptype, serialport, filename1, filename2=''):
-    downloader = bootdownload(chiptype, serialport)
-    downloader.download(filename1, filename2)
-
-def startterm(serialport=0):
-    try:
-        miniterm = Miniterm(
-            serialport,
-            115200,
-            'N',
-            rtscts=False,
-            xonxoff=False,
-            echo=False,
-            convert_outgoing=2,
-            repr_mode=0,
-        )
-    except serial.SerialException, e:
-        sys.stderr.write("could not open port %r: %s\n" % (port, e))
-        sys.exit(1)
-    miniterm.start()
-    miniterm.join(True)
-    miniterm.join()
-
-def main(argv):
-    '''
-    img2 = 'fastboot2.img'
-    '''
-    img1 = 'fastboot1.img'
-    img2 = ''
-    dev  = '/dev/serial/by-id/usb-䕇䕎䥎_㄰㌲㔴㜶㤸-if00-port0'
-    try:
-        opts, args = getopt.getopt(argv,"hd:",["img1=","img2="])
-    except getopt.GetoptError:
-        print 'hisi-idt.py -d device --img1 <fastboot1> --img2 <fastboot2>'
-        sys.exit(2)
-    for opt, arg in opts:
-        if opt == '-h':
-            print 'hisi-idt.py -d device --img1 <fastboot1> --img2 <fastboot2>'
-            sys.exit()
-        elif opt in ("-d"):
-            dev = arg
-        elif opt in ("--img1"):
-            img1 = arg
-        elif opt in ("--img2"):
-            img2 = arg
-    print '+----------------------+'
-    print ' Serial: ', dev
-    print ' Image1: ', img1
-    print ' Image2: ', img2
-    print '+----------------------+\n'
-
-    if not os.path.isfile(img1):
-        print "Image don't exists:", img1
-        sys.exit(1)
-
-    if (img2):
-        if not os.path.isfile(img2):
-            print "Image don't exists:", img2
-            sys.exit(1)
-
-    burnboot('hi3716cv200', dev, img1, img2)
-
-if __name__ == "__main__":
-    main(sys.argv[1:])
diff --git a/installer/hikey/l-loader.bin b/installer/hikey/l-loader.bin
deleted file mode 100644
index 3c271e3..0000000
--- a/installer/hikey/l-loader.bin
+++ /dev/null
Binary files differ
diff --git a/installer/hikey/nvme.img b/installer/hikey/nvme.img
deleted file mode 100644
index e2c8fe9..0000000
--- a/installer/hikey/nvme.img
+++ /dev/null
Binary files differ
diff --git a/installer/hikey/ptable-aosp-4g.img b/installer/hikey/ptable-aosp-4g.img
deleted file mode 100644
index 43bf8a9..0000000
--- a/installer/hikey/ptable-aosp-4g.img
+++ /dev/null
Binary files differ
diff --git a/installer/hikey/ptable-aosp-8g.img b/installer/hikey/ptable-aosp-8g.img
deleted file mode 100644
index 631fd8a..0000000
--- a/installer/hikey/ptable-aosp-8g.img
+++ /dev/null
Binary files differ
diff --git a/installer/hikey960/fip.bin b/installer/hikey960/fip.bin
deleted file mode 100644
index 53d4950..0000000
--- a/installer/hikey960/fip.bin
+++ /dev/null
Binary files differ
diff --git a/installer/hikey960/l-loader.bin b/installer/hikey960/l-loader.bin
deleted file mode 100644
index 2ad7a23..0000000
--- a/installer/hikey960/l-loader.bin
+++ /dev/null
Binary files differ
diff --git a/installer/hikey960/prm_ptable.img b/installer/hikey960/prm_ptable.img
deleted file mode 100644
index c81ffcf..0000000
--- a/installer/hikey960/prm_ptable.img
+++ /dev/null
Binary files differ
diff --git a/installer/hikey960/uefi-flash-all.sh b/installer/hikey960/uefi-flash-all.sh
deleted file mode 100755
index fe42486..0000000
--- a/installer/hikey960/uefi-flash-all.sh
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/bin/bash
-
-INSTALLER_DIR="`dirname ${0}`"
-ECHO_PREFIX="=== "
-
-# for cases that don't run "lunch hikey960-userdebug"
-if [ -z "${ANDROID_BUILD_TOP}" ]; then
-    ANDROID_BUILD_TOP=${INSTALLER_DIR}/../../../../../
-    ANDROID_PRODUCT_OUT="${ANDROID_BUILD_TOP}/out/target/product/hikey960"
-fi
-
-if [ ! -d "${ANDROID_PRODUCT_OUT}" ]; then
-    echo ${ECHO_PREFIX}"error in locating out directory, check if it exist"
-    exit
-fi
-
-echo ${ECHO_PREFIX}"android out dir:${ANDROID_PRODUCT_OUT}"
-
-function check_partition_table_version () {
-	fastboot erase reserved
-	if [ $? -eq 0 ]
-	then
-		IS_PTABLE_1MB_ALIGNED=true
-	else
-		IS_PTABLE_1MB_ALIGNED=false
-	fi
-}
-
-function flashing_atf_uefi () {
-	fastboot flash ptable "${INSTALLER_DIR}"/prm_ptable.img
-	fastboot flash xloader "${INSTALLER_DIR}"/hisi-sec_xloader.img
-	fastboot reboot-bootloader
-
-	fastboot flash fastboot "${INSTALLER_DIR}"/l-loader.bin
-	fastboot flash fip "${INSTALLER_DIR}"/fip.bin
-	fastboot flash nvme "${INSTALLER_DIR}"/hisi-nvme.img
-	fastboot flash fw_lpm3   "${INSTALLER_DIR}"/hisi-lpm3.img
-	fastboot flash trustfirmware   "${INSTALLER_DIR}"/hisi-bl31.bin
-	fastboot reboot-bootloader
-
-	fastboot flash ptable "${INSTALLER_DIR}"/prm_ptable.img
-	fastboot flash xloader "${INSTALLER_DIR}"/hisi-sec_xloader.img
-	fastboot flash fastboot "${INSTALLER_DIR}"/l-loader.bin
-	fastboot flash fip "${INSTALLER_DIR}"/fip.bin
-
-	fastboot flash boot "${ANDROID_PRODUCT_OUT}"/boot.img
-	fastboot flash system "${ANDROID_PRODUCT_OUT}"/system.img
-	fastboot flash vendor "${ANDROID_PRODUCT_OUT}"/vendor.img
-	fastboot flash cache "${ANDROID_PRODUCT_OUT}"/cache.img
-	fastboot flash userdata "${ANDROID_PRODUCT_OUT}"/userdata.img
-}
-
-function upgrading_ptable_1mb_aligned () {
-	fastboot flash xloader "${INSTALLER_DIR}"/hisi-sec_xloader.img
-	fastboot flash ptable "${INSTALLER_DIR}"/hisi-ptable.img
-	fastboot flash fastboot "${INSTALLER_DIR}"/hisi-fastboot.img
-	fastboot reboot-bootloader
-}
-
-echo ${ECHO_PREFIX}"Checking partition table version..."
-check_partition_table_version
-
-if [ "${IS_PTABLE_1MB_ALIGNED}" == "true" ]
-then
-	echo ${ECHO_PREFIX}"Partition table is 1MB aligned. Flashing ATF/UEFI..."
-	flashing_atf_uefi
-else
-	echo ${ECHO_PREFIX}"Partition table is 512KB aligned."
-	echo ${ECHO_PREFIX}"Upgrading to 1MB aligned version..."
-	upgrading_ptable_1mb_aligned
-	echo ${ECHO_PREFIX}"Flasing ATF/UEFI..."
-	flashing_atf_uefi
-	echo ${ECHO_PREFIX}"Done"
-fi
-
-fastboot reboot
diff --git a/l-loader/.gitignore b/l-loader/.gitignore
deleted file mode 100644
index b282a0e..0000000
--- a/l-loader/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/*.o
-/*.img
-/*.bin
diff --git a/l-loader/COPYING b/l-loader/COPYING
deleted file mode 100644
index 4ad3f20..0000000
--- a/l-loader/COPYING
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2014-2016, Linaro Ltd. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-* Redistributions of source code must retain the above copyright
-  notice, this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright
-  notice, this list of conditions and the following disclaimer in
-  the documentation and/or other materials provided with the
-  distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
diff --git a/l-loader/Makefile b/l-loader/Makefile
deleted file mode 100644
index 5331c39..0000000
--- a/l-loader/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-.PHONY: hikey
-hikey:
-	$(MAKE) -f hikey.mk
-
-.PHONY: hikey-clean
-hikey-clean:
-	$(MAKE) -f hikey.mk clean
-
-.PHONY: hikey960
-hikey960:
-	$(MAKE) -f hikey960.mk
-
-.PHONY: hikey960-clean
-hikey960-clean:
-	$(MAKE) -f hikey960.mk clean
diff --git a/l-loader/README.md b/l-loader/README.md
deleted file mode 100644
index e5dcd99..0000000
--- a/l-loader/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# l-loader
-
-Used to switch from aarch32 to aarch64 and boot. First image to be flashed
-when in recovery mode.
-
-HiKey specific.
diff --git a/l-loader/gen_loader.py b/l-loader/gen_loader.py
deleted file mode 100755
index 2d763ca..0000000
--- a/l-loader/gen_loader.py
+++ /dev/null
@@ -1,268 +0,0 @@
-#!/usr/bin/env python
-
-import os
-import os.path
-import sys, getopt
-import binascii
-import struct
-import string
-
-class generator(object):
-    #
-    # struct l_loader_head {
-    #      unsigned int	first_instr;
-    #      unsigned char	magic[16];	@ BOOTMAGICNUMBER!
-    #      unsigned int	l_loader_start;
-    #      unsigned int	l_loader_end;
-    # };
-    file_header = [0, 0, 0, 0, 0, 0, 0]
-
-    #
-    # struct entry_head {
-    #       unsigned char   magic[8];           @ ENTY
-    #       unsigned char   name[8];            @ loader/bl1
-    #       unsigned int    start_lba;
-    #       unsigned int    count_lba;
-    #       unsigned int    flag;               @ boot partition or not
-    # };
-
-    s1_entry_name = ['loader', 'bl1']
-    s2_entry_name = ['primary', 'second']
-
-    block_size = 512
-
-    stage = 0
-
-    # set in self.add()
-    idx = 0
-
-    # set in self.parse()
-    ptable_lba = 0
-    stable_lba = 0
-
-    # file pointer
-    p_entry = 0
-    p_file = 0
-
-    def __init__(self, out_img):
-        try:
-            self.fp = open(out_img, "wb+")
-        except IOError, e:
-            print "*** file open error:", e
-            sys.exit(3)
-        else:
-            self.entry_hd = [[0 for col in range(7)] for row in range(5)]
-
-    def __del__(self):
-        self.fp.close()
-
-    # parse partition from the primary ptable
-    def parse(self, fname):
-        try:
-            fptable = open(fname, "rb")
-        except IOError, e:
-            print "*** file open error:", e
-            sys.exit(3)
-        else:
-            # skip the first block in primary partition table
-            # that is MBR protection information
-            fptable.read(self.block_size)
-            # check whether it's a primary paritition table
-            data = struct.unpack("8s", fptable.read(8))
-            efi_magic = 'EFI PART'
-            if cmp("EFI PART", data[0]):
-                print "It's not partition table image."
-                fptable.close()
-                sys.exit(4)
-            # skip 16 bytes
-            fptable.read(16)
-            # get lba of both primary partition table and secondary partition table
-            data = struct.unpack("QQQQ", fptable.read(32))
-            self.ptable_lba = data[0] - 1
-            self.stable_lba = data[3] + 1
-            # skip 24 bytes
-            fptable.read(24)
-            data = struct.unpack("i", fptable.read(4))
-            pentries = data[0]
-            # skip the reset in this block
-            fptable.read(self.block_size - 84)
-
-            for i in range(1, pentries):
-                # name is encoded as UTF-16
-                d0,lba,d2,name = struct.unpack("32sQ16s72s", fptable.read(128))
-                plainname = unicode(name, "utf-16")
-                if (not cmp(plainname[0:7], 'l-loader'[0:7])):
-                    print 'bl1_lba: ', lba
-                    self.bl1_lba = lba
-                    sys.exit(1)
-
-            fptable.close()
-
-    def add(self, lba, fname):
-        try:
-            fsize = os.path.getsize(fname)
-        except IOError, e:
-            print "*** file open error:", e
-            sys.exit(4)
-        else:
-            blocks = (fsize + self.block_size - 1) / self.block_size
-            if (self.stage == 1):
-                # Boot Area1 in eMMC
-                bootp = 1
-                if self.idx == 0:
-                    self.p_entry = 28
-            elif (self.stage == 2):
-                # User Data Area in eMMC
-                bootp = 0
-                # create an empty block only for stage2
-                # This empty block is used to store entry head
-                print 'p_file: ', self.p_file, 'p_entry: ', self.p_entry
-                if self.idx == 0:
-                    self.fp.seek(self.p_file)
-                    for i in range (0, self.block_size):
-                        zero = struct.pack('x')
-                        self.fp.write(zero)
-                    self.p_file += self.block_size
-                    self.p_entry = 0
-            else:
-                print "wrong stage ", stage, "is specified"
-                sys.exit(4)
-            # Maybe the file size isn't aligned. So pad it.
-            if (self.idx == 0) and (self.stage == 1):
-                if fsize > 2048:
-                    print 'loader size exceeds 2KB. file size: ', fsize
-                    sys.exit(4)
-                else:
-                    left_bytes = 2048 - fsize
-            else:
-                left_bytes = fsize % self.block_size
-                if left_bytes:
-                    left_bytes = self.block_size - left_bytes
-            print 'lba: ', lba, 'blocks: ', blocks, 'bootp: ', bootp, 'fname: ', fname
-            # write images
-            fimg = open(fname, "rb")
-            for i in range (0, blocks):
-                buf = fimg.read(self.block_size)
-                self.fp.seek(self.p_file)
-                self.fp.write(buf)
-                # p_file is the file pointer of the new binary file
-                # At last, it means the total block size of the new binary file
-                self.p_file += self.block_size
-
-            if (self.idx == 0) and (self.stage == 1):
-                self.p_file = 2048
-            print 'p_file: ', self.p_file, 'last block is ', fsize % self.block_size, 'bytes', '  tell: ', self.fp.tell(), 'left_bytes: ', left_bytes
-            if left_bytes:
-                for i in range (0, left_bytes):
-                    zero = struct.pack('x')
-                    self.fp.write(zero)
-                print 'p_file: ', self.p_file, '  pad to: ', self.fp.tell()
-
-            # write entry information at the header
-            if self.stage == 1:
-                byte = struct.pack('8s8siii', 'ENTRYHDR', self.s1_entry_name[self.idx], lba, blocks, bootp)
-            elif self.stage == 2:
-                byte = struct.pack('8s8siii', 'ENTRYHDR', self.s2_entry_name[self.idx], lba, blocks, bootp)
-            self.fp.seek(self.p_entry)
-            self.fp.write(byte)
-            self.p_entry += 28
-            self.idx += 1
-
-            fimg.close()
-
-    def hex2(self, data):
-        return data > 0 and hex(data) or hex(data & 0xffffffff)
-
-    def end(self):
-        if self.stage == 1:
-            self.fp.seek(20)
-            start,end = struct.unpack("ii", self.fp.read(8))
-            print "start: ", self.hex2(start), 'end: ', self.hex2(end)
-            end = start + self.p_file
-            print "start: ", self.hex2(start), 'end: ', self.hex2(end)
-            self.fp.seek(24)
-            byte = struct.pack('i', end)
-            self.fp.write(byte)
-        self.fp.close()
-
-    def create_stage1(self, img_loader, img_bl1, output_img):
-        print '+-----------------------------------------------------------+'
-        print ' Input Images:'
-        print '     loader:                       ', img_loader
-        print '     bl1:                          ', img_bl1
-        print ' Ouput Image:                      ', output_img
-        print '+-----------------------------------------------------------+\n'
-
-        self.stage = 1
-
-        # The first 2KB is reserved
-        # The next 2KB is for loader image
-        self.add(4, img_loader)    # img_loader doesn't exist in partition table
-        print 'self.idx: ', self.idx
-        # bl1.bin starts from 4KB
-        self.add(8, img_bl1)      # img_bl1 doesn't exist in partition table
-
-    def create_stage2(self, img_prm_ptable, img_sec_ptable, output_img):
-        print '+-----------------------------------------------------------+'
-        print ' Input Images:'
-        print '     primary partition table:      ', img_prm_ptable
-        print '     secondary partition table:    ', img_sec_ptable
-        print ' Ouput Image:                      ', output_img
-        print '+-----------------------------------------------------------+\n'
-
-        self.stage = 2
-        self.parse(img_prm_ptable)
-        self.add(self.ptable_lba, img_prm_ptable)
-        if (cmp(img_sec_ptable, 'secondary partition table')):
-            # Doesn't match. It means that secondary ptable is specified.
-            self.add(self.stable_lba, img_sec_ptable)
-        else:
-            print 'Don\'t need secondary partition table'
-
-def main(argv):
-    stage1 = 0
-    stage2 = 0
-    img_prm_ptable = "primary partition table"
-    img_sec_ptable = "secondary partition table"
-    try:
-        opts, args = getopt.getopt(argv,"ho:",["img_loader=","img_bl1=","img_prm_ptable=","img_sec_ptable="])
-    except getopt.GetoptError:
-        print 'gen_loader.py -o <l-loader.bin> --img_loader <l-loader> --img_bl1 <bl1.bin> --img_prm_ptable <prm_ptable.img> --img_sec_ptable <sec_ptable.img>'
-        sys.exit(2)
-    for opt, arg in opts:
-        if opt == '-h':
-            print 'gen_loader.py -o <l-loader.bin> --img_loader <l-loader> --img_bl1 <bl1.bin> --img_prm_ptable <prm_ptable.img> --img_sec_ptable <sec_ptable.img>'
-            sys.exit(1)
-        elif opt == '-o':
-            output_img = arg
-        elif opt in ("--img_loader"):
-            img_loader = arg
-            stage1 = 1
-        elif opt in ("--img_bl1"):
-            img_bl1 = arg
-            stage1 = 1
-        elif opt in ("--img_prm_ptable"):
-            img_prm_ptable = arg
-            stage2 = 1
-        elif opt in ("--img_sec_ptable"):
-            img_sec_ptable = arg
-
-    loader = generator(output_img)
-    loader.idx = 0
-
-    if (stage1 == 1) and (stage2 == 1):
-        print 'There are only loader & BL1 in stage1.'
-        print 'And there are primary partition table, secondary partition table and FIP in stage2.'
-        sys.exit(1)
-    elif (stage1 == 0) and (stage2 == 0):
-        print 'No input images are specified.'
-        sys.exit(1)
-    elif stage1 == 1:
-        loader.create_stage1(img_loader, img_bl1, output_img)
-    elif stage2 == 1:
-        loader.create_stage2(img_prm_ptable, img_sec_ptable, output_img)
-
-    loader.end()
-
-if __name__ == "__main__":
-    main(sys.argv[1:])
diff --git a/l-loader/gen_loader_hikey.py b/l-loader/gen_loader_hikey.py
deleted file mode 100755
index a07eb98..0000000
--- a/l-loader/gen_loader_hikey.py
+++ /dev/null
@@ -1,184 +0,0 @@
-#!/usr/bin/env python
-
-import os
-import os.path
-import sys, getopt
-import binascii
-import struct
-import string
-
-# --------------------------
-# | loader | BL1 | NS BL1U |
-# --------------------------
-
-class generator(object):
-    #
-    # struct l_loader_head {
-    #      unsigned int	first_instr;
-    #      unsigned char	magic[16];	@ BOOTMAGICNUMBER!
-    #      unsigned int	l_loader_start;         @ start of loader
-    #      unsigned int	l_loader_end;           @ end of BL1 (without ns_bl1u)
-    # };
-    file_header = [0, 0, 0, 0, 0, 0, 0]
-
-    #
-    # struct entry_head {
-    #       unsigned char   magic[8];           @ ENTY
-    #       unsigned char   name[8];            @ loader/bl1/ns_bl1u
-    #       unsigned int    start_lba;
-    #       unsigned int    count_lba;
-    #       unsigned int    flag;               @ boot partition or not
-    # };
-    # size of struct entry_head is 28
-    #
-
-    s1_entry_name = ['loader', 'bl1', 'ns_bl1u']
-
-    block_size = 512
-
-    # set in self.add()
-    idx = 0
-
-    # file pointer
-    p_entry = 0        # pointer in header
-    p_file = 0         # pointer in file
-    p_loader_end = 0   # pointer in header
-
-    def __init__(self, out_img):
-        try:
-            self.fp = open(out_img, "wb+")
-        except IOError, e:
-            print "*** file open error:", e
-            sys.exit(3)
-        else:
-            self.entry_hd = [[0 for col in range(7)] for row in range(5)]
-
-    def __del__(self):
-        self.fp.close()
-
-    def add(self, lba, fname):
-        try:
-            fsize = os.path.getsize(fname)
-        except IOError, e:
-            print "*** file open error:", e
-            sys.exit(4)
-        else:
-            blocks = (fsize + self.block_size - 1) / self.block_size
-            # Boot Area1 in eMMC
-            bootp = 1
-            if self.idx == 0:
-                # both loader and bl1.bin locates in l-loader.bin bias 2KB
-                self.p_entry = 28
-            elif (self.idx > 1):
-                # image: ns_bl1u
-                # Record the end of loader & BL1. ns_bl1u won't be loaded by BootROM.
-                self.p_loader_end = self.p_file
-                # ns_bl1u should locates in l-loader.bin bias 2KB too
-                if (self.p_file < (lba * self.block_size - 2048)):
-                    self.p_file = lba * self.block_size - 2048
-
-            # Maybe the file size isn't aligned. So pad it.
-            if (self.idx == 0):
-                if fsize > 2048:
-                    print 'loader size exceeds 2KB. file size: ', fsize
-                    sys.exit(4)
-                else:
-                    left_bytes = 2048 - fsize
-            else:
-                left_bytes = fsize % self.block_size
-                if left_bytes:
-                    left_bytes = self.block_size - left_bytes
-            print 'lba: ', lba, 'blocks: ', blocks, 'bootp: ', bootp, 'fname: ', fname
-            # write images
-            fimg = open(fname, "rb")
-            for i in range (0, blocks):
-                buf = fimg.read(self.block_size)
-                # loader's p_file is 0 at here
-                self.fp.seek(self.p_file)
-                self.fp.write(buf)
-                # p_file is the file pointer of the new binary file
-                # At last, it means the total block size of the new binary file
-                self.p_file += self.block_size
-
-            if (self.idx == 0):
-                self.p_file = 2048
-            print 'p_file: ', self.p_file, 'last block is ', fsize % self.block_size, 'bytes', '  tell: ', self.fp.tell(), 'left_bytes: ', left_bytes
-            if left_bytes:
-                for i in range (0, left_bytes):
-                    zero = struct.pack('x')
-                    self.fp.write(zero)
-                print 'p_file: ', self.p_file, '  pad to: ', self.fp.tell()
-
-            # write entry information at the header
-            byte = struct.pack('8s8siii', 'ENTRYHDR', self.s1_entry_name[self.idx], lba, blocks, bootp)
-            self.fp.seek(self.p_entry)
-            self.fp.write(byte)
-            self.p_entry += 28
-            self.idx += 1
-
-            fimg.close()
-
-    def hex2(self, data):
-        return data > 0 and hex(data) or hex(data & 0xffffffff)
-
-    def end(self):
-        self.fp.seek(20)
-        start,end = struct.unpack("ii", self.fp.read(8))
-        print "start: ", self.hex2(start), 'end: ', self.hex2(end)
-        end = start + self.p_loader_end
-        print "start: ", self.hex2(start), 'end: ', self.hex2(end)
-        self.fp.seek(24)
-        byte = struct.pack('i', end)
-        self.fp.write(byte)
-        self.fp.close()
-
-    def create(self, img_loader, img_bl1, img_ns_bl1u, output_img):
-        print '+-----------------------------------------------------------+'
-        print ' Input Images:'
-        print '     loader:                       ', img_loader
-        print '     bl1:                          ', img_bl1
-        print '     ns_bl1u:                      ', img_ns_bl1u
-        print ' Ouput Image:                      ', output_img
-        print '+-----------------------------------------------------------+\n'
-
-        self.stage = 1
-
-        # The first 2KB is reserved
-        # The next 2KB is for loader image
-        self.add(4, img_loader)
-        print 'self.idx: ', self.idx
-        # bl1.bin starts from 4KB
-        self.add(8, img_bl1)
-        if img_ns_bl1u != 0:
-            # ns_bl1u.bin starts from 96KB
-            self.add(192, img_ns_bl1u)
-
-def main(argv):
-    img_ns_bl1u = 0
-    try:
-        opts, args = getopt.getopt(argv,"ho:",["img_loader=","img_bl1=","img_ns_bl1u="])
-    except getopt.GetoptError:
-        print 'gen_loader.py -o <l-loader.bin> --img_loader <l-loader> --img_bl1 <bl1.bin> --img_ns_bl1u <ns_bl1u.bin>'
-        sys.exit(2)
-    for opt, arg in opts:
-        if opt == '-h':
-            print 'gen_loader.py -o <l-loader.bin> --img_loader <l-loader> --img_bl1 <bl1.bin> --img_ns_bl1u <ns_bl1u.bin>'
-            sys.exit(1)
-        elif opt == '-o':
-            output_img = arg
-        elif opt in ("--img_loader"):
-            img_loader = arg
-        elif opt in ("--img_bl1"):
-            img_bl1 = arg
-        elif opt in ("--img_ns_bl1u"):
-            img_ns_bl1u = arg
-
-    loader = generator(output_img)
-    loader.idx = 0
-
-    loader.create(img_loader, img_bl1, img_ns_bl1u, output_img)
-
-    loader.end()
-
-if __name__ == "__main__":
-    main(sys.argv[1:])
diff --git a/l-loader/generate_ptable.sh b/l-loader/generate_ptable.sh
deleted file mode 100755
index f8a6a20..0000000
--- a/l-loader/generate_ptable.sh
+++ /dev/null
@@ -1,195 +0,0 @@
-#!/bin/sh
-#
-# Generate partition table for HiKey eMMC or HiKey960 UFS
-#
-# tiny: for testing purpose.
-# aosp: (same as linux with userdata).
-# linux: (same as aosp without userdata).
-# swap: (similar to asop, drop reserved, 1.5G of swap)
-
-PTABLE=${PTABLE:-aosp}
-SECTOR_SIZE=${SECTOR_SIZE:-512}
-SGDISK=${SGDISK:-sgdisk}
-TEMP_FILE=$(mktemp /tmp/${PTABLE}.XXXXXX)
-# 128 entries at most
-ENTRIES_IN_SECTOR=$(expr ${SECTOR_SIZE} / 128)
-ENTRY_SECTORS=$(expr 128 / ${ENTRIES_IN_SECTOR})
-PRIMARY_SECTORS=$(expr ${ENTRY_SECTORS} + 2)
-SECONDARY_SECTORS=$(expr ${ENTRY_SECTORS} + 1)
-
-case ${PTABLE} in
-  tiny)
-    SECTOR_NUMBER=81920
-    ;;
-  aosp-4g|linux-4g)
-    SECTOR_NUMBER=7471104
-    ;;
-  aosp-8g|linux-8g|swap-8g)
-    SECTOR_NUMBER=15269888
-    ;;
-  aosp-32g*|linux-32g)
-    SECTOR_NUMBER=62447650    # count with 512-byte block size
-    ;;
-  aosp-64g|linux-64g)
-    SECTOR_NUMBER=124895300   # count with 512-byte block size
-    ;;
-esac
-
-SECTOR_ALIGNMENT=$(expr ${SECTOR_SIZE} / 512)
-SECTOR_NUMBER=$(expr '(' ${SECTOR_NUMBER} '*' 512 + ${SECTOR_SIZE} - 1 ')' / ${SECTOR_SIZE})
-
-# get the partition table
-case ${PTABLE} in
-  tiny)
-    dd if=/dev/zero of=${TEMP_FILE} bs=${SECTOR_SIZE} count=${SECTOR_NUMBER} conv=sparse
-    fakeroot ${SGDISK} -U -R -v ${TEMP_FILE}
-    fakeroot ${SGDISK} -n 1:2048:4095 -t 1:0700 -u 1:F9F21F01-A8D4-5F0E-9746-594869AEC3E4 -c 1:"vrl" -p ${TEMP_FILE}
-    fakeroot ${SGDISK} -n 2:4096:6143 -t 2:0700 -u 2:F9F21F02-A8D4-5F04-9746-594869AEC3E4 -c 2:"vrl_backup" -p ${TEMP_FILE}
-    ;;
-  aosp-4g|aosp-8g)
-    dd if=/dev/zero of=${TEMP_FILE} bs=${SECTOR_SIZE} count=${SECTOR_NUMBER} conv=sparse
-    fakeroot ${SGDISK} -U 2CB85345-6A91-4043-8203-723F0D28FBE8 -v ${TEMP_FILE}
-    #[1: vrl: 1M-2M]
-    fakeroot ${SGDISK} -n 1:0:+1M -t 1:0700 -u 1:496847AB-56A1-4CD5-A1AD-47F4ACF055C9 -c 1:"vrl" ${TEMP_FILE}
-    #[2: vrl_backup: 2M-3M]
-    fakeroot ${SGDISK} -n 2:0:+1M -t 2:0700 -u 2:61A36FC1-8EFB-4899-84D8-B61642EFA723 -c 2:"vrl_backup" ${TEMP_FILE}
-    #[3: mcuimage: 3M-4M]
-    fakeroot ${SGDISK} -n 3:0:+1M -t 3:0700 -u 3:65007411-962D-4781-9B2C-51DD7DF22CC3 -c 3:"mcuimage" ${TEMP_FILE}
-    #[4: fastboot: 4M-12M]
-    fakeroot ${SGDISK} -n 4:0:+8M -t 4:EF02 -u 4:496847AB-56A1-4CD5-A1AD-47F4ACF055C9 -c 4:"fastboot" ${TEMP_FILE}
-    #[5: nvme: 12M-14M]
-    fakeroot ${SGDISK} -n 5:0:+2M -t 5:0700 -u 5:00354BCD-BBCB-4CB3-B5AE-CDEFCB5DAC43 -c 5:"nvme" ${TEMP_FILE}
-    #[6: boot: 14M-78M]
-    fakeroot ${SGDISK} -n 6:0:+64M -t 6:EF00 -u 6:5C0F213C-17E1-4149-88C8-8B50FB4EC70E -c 6:"boot" ${TEMP_FILE}
-    #[7: vendor: 78M-334M]
-    fakeroot ${SGDISK} -n 7:0:+256M -t 7:0700 -u 7:BED8EBDC-298E-4A7A-B1F1-2500D98453B7 -c 7:"vendor" ${TEMP_FILE}
-    #[8: cache: 334M-590M]
-    fakeroot ${SGDISK} -n 8:0:+256M -t 8:8301 -u 8:A092C620-D178-4CA7-B540-C4E26BD6D2E2 -c 8:"cache" ${TEMP_FILE}
-    #[9: system: 590M-2126M]
-    fakeroot ${SGDISK} -n 9:0:+1536M -t 9:8300 -u 9:FC56E345-2E8E-49AE-B2F8-5B9D263FE377 -c 9:"system" ${TEMP_FILE}
-    #[10: userdata: 2126M-End]
-    fakeroot ${SGDISK} -n -E -t 10:8300 -u 10:064111F6-463B-4CE1-876B-13F3684CE164 -c 10:"userdata" -p ${TEMP_FILE}
-    ;;
-  linux-4g|linux-8g)
-    dd if=/dev/zero of=${TEMP_FILE} bs=${SECTOR_SIZE} count=${SECTOR_NUMBER} conv=sparse
-    fakeroot ${SGDISK} -U 2CB85345-6A91-4043-8203-723F0D28FBE8 -v ${TEMP_FILE}
-    #[1: vrl: 1M-2M]
-    fakeroot ${SGDISK} -n 1:0:+1M -t 1:0700 -u 1:496847AB-56A1-4CD5-A1AD-47F4ACF055C9 -c 1:"vrl" ${TEMP_FILE}
-    #[2: vrl_backup: 2M-3M]
-    fakeroot ${SGDISK} -n 2:0:+1M -t 2:0700 -u 2:61A36FC1-8EFB-4899-84D8-B61642EFA723 -c 2:"vrl_backup" ${TEMP_FILE}
-    #[3: mcuimage: 3M-4M]
-    fakeroot ${SGDISK} -n 3:0:+1M -t 3:0700 -u 3:65007411-962D-4781-9B2C-51DD7DF22CC3 -c 3:"mcuimage" ${TEMP_FILE}
-    #[4: fastboot: 4M-12M]
-    fakeroot ${SGDISK} -n 4:0:+8M -t 4:EF02 -u 4:496847AB-56A1-4CD5-A1AD-47F4ACF055C9 -c 4:"fastboot" ${TEMP_FILE}
-    #[5: nvme: 12M-14M]
-    fakeroot ${SGDISK} -n 5:0:+2M -t 5:0700 -u 5:00354BCD-BBCB-4CB3-B5AE-CDEFCB5DAC43 -c 5:"nvme" ${TEMP_FILE}
-    #[6: boot: 14M-78M]
-    fakeroot ${SGDISK} -n 6:0:+64M -t 6:EF00 -u 6:5C0F213C-17E1-4149-88C8-8B50FB4EC70E -c 6:"boot" ${TEMP_FILE}
-    #[7: reserved: 78M-334M]
-    fakeroot ${SGDISK} -n 7:0:+256M -t 7:0700 -u 7:BED8EBDC-298E-4A7A-B1F1-2500D98453B7 -c 7:"reserved" ${TEMP_FILE}
-    #[8: cache: 334M-590M]
-    fakeroot ${SGDISK} -n 8:0:+256M -t 8:8301 -u 8:A092C620-D178-4CA7-B540-C4E26BD6D2E2 -c 8:"cache" ${TEMP_FILE}
-    #[9: system: 590M-End]
-    fakeroot ${SGDISK} -n -E -t 9:8300 -u 9:FC56E345-2E8E-49AE-B2F8-5B9D263FE377 -c 9:"system" ${TEMP_FILE}
-    ;;
-  swap-8g)
-    dd if=/dev/zero of=${TEMP_FILE} bs=${SECTOR_SIZE} count=${SECTOR_NUMBER} conv=sparse
-    fakeroot ${SGDISK} -U 2CB85345-6A91-4043-8203-723F0D28FBE8 -v ${TEMP_FILE}
-    #[1: vrl: 1M-2M]
-    fakeroot ${SGDISK} -n 1:0:+1M -t 1:0700 -u 1:496847AB-56A1-4CD5-A1AD-47F4ACF055C9 -c 1:"vrl" ${TEMP_FILE}
-    #[2: vrl_backup: 2M-3M]
-    fakeroot ${SGDISK} -n 2:0:+1M -t 2:0700 -u 2:61A36FC1-8EFB-4899-84D8-B61642EFA723 -c 2:"vrl_backup" ${TEMP_FILE}
-    #[3: mcuimage: 3M-4M]
-    fakeroot ${SGDISK} -n 3:0:+1M -t 3:0700 -u 3:65007411-962D-4781-9B2C-51DD7DF22CC3 -c 3:"mcuimage" ${TEMP_FILE}
-    #[4: fastboot: 4M-12M]
-    fakeroot ${SGDISK} -n 4:0:+8M -t 4:EF02 -u 4:496847AB-56A1-4CD5-A1AD-47F4ACF055C9 -c 4:"fastboot" ${TEMP_FILE}
-    #[5: nvme: 12M-14M]
-    fakeroot ${SGDISK} -n 5:0:+2M -t 5:0700 -u 5:00354BCD-BBCB-4CB3-B5AE-CDEFCB5DAC43 -c 5:"nvme" ${TEMP_FILE}
-    #[6: boot: 14M-78M]
-    fakeroot ${SGDISK} -n 6:0:+64M -t 6:EF00 -u 6:5C0F213C-17E1-4149-88C8-8B50FB4EC70E -c 6:"boot" ${TEMP_FILE}
-    #[7: cache: 78M-384M]
-    fakeroot ${SGDISK} -n 7:0:+256M -t 7:8301 -u 7:A092C620-D178-4CA7-B540-C4E26BD6D2E2 -c 7:"cache" ${TEMP_FILE}
-    #[8: swap: 384M-1920M]
-    fakeroot ${SGDISK} -n 8:0:+1536M -t 8:8200 -u 8:FC56E344-2E8E-49AE-B2F8-5B9D263FE377 -c 8:"swap" ${TEMP_FILE}
-    #[9: system: 1920M-3556M]
-    fakeroot ${SGDISK} -n 9:0:+1536M -t 9:8300 -u 9:FC56E345-2E8E-49AE-B2F8-5B9D263FE377 -c 9:"system" ${TEMP_FILE}
-    #[10: userdata: 3556M-End]
-    fakeroot ${SGDISK} -n -E -t 10:8300 -u 10:064111F6-463B-4CE1-876B-13F3684CE164 -c 10:"userdata" -p ${TEMP_FILE}
-    ;;
-  aosp-32g*|aosp-64g)
-    dd if=/dev/zero of=${TEMP_FILE} bs=${SECTOR_SIZE} count=${SECTOR_NUMBER} conv=sparse
-    fakeroot ${SGDISK} -U 2CB85345-6A91-4043-8203-723F0D28FBE8 -v ${TEMP_FILE}
-    #[1: xloader_reserved1: 1M-2M]
-    fakeroot ${SGDISK} -n 1:0:+1M -t 1:0700 -u 1:697c41e0-7a59-4dfa-a9a6-aa43ac5be684 -c 1:"xloader_reserved1" ${TEMP_FILE}
-    #[2: fastboot: 2M-14M]
-    fakeroot ${SGDISK} -n 2:0:+12M -t 2:0700 -u 2:3f5f8c48-4402-4ace-9058-30bfea4fa53f -c 2:"fastboot" ${TEMP_FILE}
-    #[3: nvme: 14M-20M]
-    fakeroot ${SGDISK} -n 3:0:+6M -t 3:0700 -u 3:e2f5e2a9-c9b7-4089-9859-4498f1d3ef7e -c 3:"nvme" ${TEMP_FILE}
-    #[4: fip: 20M-32M]
-    fakeroot ${SGDISK} -n 4:0:+12M -t 3:0700 -u 4:dc1a888e-f17c-4964-92d6-f8fcc402ed8b -c 4:"fip" ${TEMP_FILE}
-    #[5: cache: 32M-288M]
-    fakeroot ${SGDISK} -n 5:0:+256M -t 5:0700 -u 5:10cc3268-05f0-4db2-aa00-707361427fc8 -c 5:"cache" ${TEMP_FILE}
-    #[6: fw_lpm3: 288M-289M]
-    fakeroot ${SGDISK} -n 6:0:+1M -t 6:0700 -u 6:5d8481d4-c170-4aa8-9438-8743c73ea8f5 -c 6:"fw_lpm3" ${TEMP_FILE}
-    #[7: boot: 289M-353M]
-    fakeroot ${SGDISK} -n 7:0:+64M -t 7:EF00 -u 7:d3340696-9b95-4c64-8df6-e6d4548fba41 -c 7:"boot" ${TEMP_FILE}
-    #[8: dts: 353M-369M]
-    fakeroot ${SGDISK} -n 8:0:+16M -t 8:0700 -u 8:6e53b0bb-fa7e-4206-b607-5ae699e9f066 -c 8:"dts" ${TEMP_FILE}
-    #[9: trustfirmware: 369M-371M]
-    fakeroot ${SGDISK} -n 9:0:+2M -t 9:0700 -u 9:f1e126a6-ceef-45c1-aace-29f33ac9cf13 -c 9:"trustfirmware" ${TEMP_FILE}
-    #[10: system: 371M-5059M]
-    fakeroot ${SGDISK} -n 10:0:+4688M -t 10:8300 -u 10:c3e50923-fb85-4153-b925-759614d4dfcd -c 10:"system" ${TEMP_FILE}
-    #[11: vendor: 5059M-5843M]
-    fakeroot ${SGDISK} -n 11:0:+784M -t 11:0700 -u 11:919d7080-d71a-4ae1-9227-e4585210c837 -c 11:"vendor" ${TEMP_FILE}
-    #[12: reserved: 5843M-5844M]
-    fakeroot ${SGDISK} -n 12:0:+1M -t 12:0700 -u 12:611eac6b-bc42-4d72-90ac-418569c8e9b8 -c 12:"reserved" ${TEMP_FILE}
-    case ${PTABLE} in
-      aosp-32g)
-        #[13: userdata: 5844M-End]
-        fakeroot ${SGDISK} -n -E -t 13:8300 -u 13:fea80d9c-f3e3-45d9-aed0-1d06e4abd77f -c 13:"userdata" ${TEMP_FILE}
-        ;;
-      aosp-32g-spare)
-        #[13: userdata: 5844M-9844M]
-        fakeroot ${SGDISK} -n 13:0:+1000M -t 13:8300 -u 13:fea80d9c-f3e3-45d9-aed0-1d06e4abd77f -c 13:"userdata" ${TEMP_FILE}
-        #[14: swap: 9844M-End]
-        fakeroot ${SGDISK} -n -E -t 14:8300 -u 14:9501eade-20fb-4bc7-83d3-62c1be3ed92d -c 14:"swap" ${TEMP_FILE}
-        ;;
-    esac
-    ;;
-  linux-32g|linux-64g)
-    dd if=/dev/zero of=${TEMP_FILE} bs=${SECTOR_SIZE} count=${SECTOR_NUMBER} conv=sparse
-    fakeroot ${SGDISK} -U 2CB85345-6A91-4043-8203-723F0D28FBE8 -v ${TEMP_FILE}
-    #[1: vrl: 1M-2M]
-    fakeroot ${SGDISK} -n 1:0:+1M -t 1:0700 -u 1:697c41e0-7a59-4dfa-a9a6-aa43ac5be684 -c 1:"vrl" ${TEMP_FILE}
-    #[2: fastboot: 2M-14M]
-    fakeroot ${SGDISK} -n 2:0:+12M -t 2:0700 -u 2:3f5f8c48-4402-4ace-9058-30bfea4fa53f -c 2:"fastboot" ${TEMP_FILE}
-    #[3: nvme: 14M-20M]
-    fakeroot ${SGDISK} -n 3:0:+6M -t 3:0700 -u 3:e2f5e2a9-c9b7-4089-9859-4498f1d3ef7e -c 3:"nvme" ${TEMP_FILE}
-    #[4: fip: 20M-32M]
-    fakeroot ${SGDISK} -n 4:0:+12M -t 3:0700 -u 4:dc1a888e-f17c-4964-92d6-f8fcc402ed8b -c 4:"fip" ${TEMP_FILE}
-    #[5: cache: 32M-288M]
-    fakeroot ${SGDISK} -n 5:0:+256M -t 5:0700 -u 5:10cc3268-05f0-4db2-aa00-707361427fc8 -c 5:"cache" ${TEMP_FILE}
-    #[6: fw_lpm3: 288M-289M]
-    fakeroot ${SGDISK} -n 6:0:+1M -t 6:0700 -u 6:5d8481d4-c170-4aa8-9438-8743c73ea8f5 -c 6:"fw_lpm3" ${TEMP_FILE}
-    #[7: boot: 289M-353M]
-    fakeroot ${SGDISK} -n 7:0:+64M -t 7:EF00 -u 7:d3340696-9b95-4c64-8df6-e6d4548fba41 -c 7:"boot" ${TEMP_FILE}
-    #[8: dts: 353M-369M]
-    fakeroot ${SGDISK} -n 8:0:+16M -t 8:0700 -u 8:6e53b0bb-fa7e-4206-b607-5ae699e9f066 -c 8:"dts" ${TEMP_FILE}
-    #[9: trustfirmware: 369M-371M]
-    fakeroot ${SGDISK} -n 9:0:+2M -t 9:0700 -u 9:f1e126a6-ceef-45c1-aace-29f33ac9cf13 -c 9:"trustfirmware" ${TEMP_FILE}
-    #[10: system: 371M-5059M]
-    fakeroot ${SGDISK} -n 10:0:+4688M -t 10:8300 -u 10:c3e50923-fb85-4153-b925-759614d4dfcd -c 10:"system" ${TEMP_FILE}
-    #[11: vendor: 5059M-5843M]
-    fakeroot ${SGDISK} -n 11:0:+784M -t 11:0700 -u 11:919d7080-d71a-4ae1-9227-e4585210c837 -c 11:"vendor" ${TEMP_FILE}
-    #[12: reserved: 5843M-5844M]
-    fakeroot ${SGDISK} -n 12:0:+1M -t 12:0700 -u 12:611eac6b-bc42-4d72-90ac-418569c8e9b8 -c 12:"reserved" ${TEMP_FILE}
-    ;;
-esac
-
-# get the primary partition table
-dd if=${TEMP_FILE} of=prm_ptable.img bs=${SECTOR_SIZE} count=${PRIMARY_SECTORS}
-
-BK_PTABLE_LBA=$(expr ${SECTOR_NUMBER} - ${SECONDARY_SECTORS})
-dd if=${TEMP_FILE} of=sec_ptable.img skip=${BK_PTABLE_LBA} bs=${SECTOR_SIZE} count=${SECONDARY_SECTORS}
-
-rm -f ${TEMP_FILE}
diff --git a/l-loader/hikey.mk b/l-loader/hikey.mk
deleted file mode 100644
index 16c1d97..0000000
--- a/l-loader/hikey.mk
+++ /dev/null
@@ -1,31 +0,0 @@
-CROSS_COMPILE?=arm-linux-gnueabihf-
-CC=$(CROSS_COMPILE)gcc
-LD=$(CROSS_COMPILE)ld
-OBJCOPY=$(CROSS_COMPILE)objcopy
-CFLAGS=-march=armv7-a
-
-BL1=bl1.bin
-NS_BL1U=recovery-fastboot.bin
-PTABLE_LST?=aosp-8g aosp-4g
-
-.PHONY: all
-all: l-loader.bin prm_ptable.img
-
-%.o: %.S
-	$(CC) $(CFLAGS) -c -o $@ $<
-
-l-loader.bin: start.o $(BL1) $(NS_BL1U)
-	$(LD) -Bstatic -Tl-loader.lds -Ttext 0xf9800800 start.o -o loader
-	$(OBJCOPY) -O binary loader temp
-	python gen_loader_hikey.py -o $@ --img_loader=temp --img_bl1=$(BL1) --img_ns_bl1u=$(NS_BL1U)
-	rm -f loader temp
-
-prm_ptable.img:
-	for ptable in $(PTABLE_LST); do \
-		PTABLE=$${ptable} SECTOR_SIZE=512 bash -x generate_ptable.sh;\
-		cp prm_ptable.img ptable-$${ptable}.img;\
-	done
-
-.PHONY: clean
-clean:
-	rm -f *.o *.img l-loader.bin
diff --git a/l-loader/hikey960.mk b/l-loader/hikey960.mk
deleted file mode 100644
index e378b75..0000000
--- a/l-loader/hikey960.mk
+++ /dev/null
@@ -1,19 +0,0 @@
-BL1=bl1.bin
-NS_BL1U=BL33_AP_UEFI.fd
-PTABLE_LST:=aosp-32g aosp-32g-spare linux-32g
-
-.PHONY: all
-all: l-loader.bin prm_ptable.img
-
-l-loader.bin: $(BL1) $(NS_BL1U)
-	python gen_loader_hikey960.py -o $@ --img_bl1=$(BL1) --img_ns_bl1u=$(NS_BL1U)
-
-prm_ptable.img:
-	for ptable in $(PTABLE_LST); do \
-		PTABLE=$${ptable} SECTOR_SIZE=4096 SGDISK=./sgdisk bash -x generate_ptable.sh;\
-		cp prm_ptable.img ptable-$${ptable}.img;\
-	done
-
-.PHONY: clean
-clean:
-	rm -f *.img l-loader.bin
diff --git a/l-loader/l-loader.lds b/l-loader/l-loader.lds
deleted file mode 100644
index 41eb16f..0000000
--- a/l-loader/l-loader.lds
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2014 Linaro Ltd.
- */
-
-OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
-OUTPUT_ARCH(arm)
-ENTRY(_start)
-SECTIONS
-{
-	. = 0xf9800800;
-	LLOADER_START = .;
-
-	.text :
-	{
-		*(.text)
-		*(.rodata)
-	}
-
-	.data ALIGN(4):
-	{
-		*(.data)
-	}
-
-	. = ALIGN(4);
-
-	.bss ALIGN(4):
-	{
-		*(.bss)
-	}
-
-	LLOADER_BL1_BIN = 0xf9801000;
-}
diff --git a/l-loader/recovery-fastboot.bin b/l-loader/recovery-fastboot.bin
deleted file mode 100755
index fe56262..0000000
--- a/l-loader/recovery-fastboot.bin
+++ /dev/null
Binary files differ
diff --git a/l-loader/start.S b/l-loader/start.S
deleted file mode 100644
index a0d838a..0000000
--- a/l-loader/start.S
+++ /dev/null
@@ -1,100 +0,0 @@
-	.text
-
-/*
- * The head of l-loader is defined in below.
- * struct l_loader_head {
- *	unsigned int	first_instr;
- *	unsigned char	magic[16];	@ BOOTMAGICNUMBER!
- *	unsigned int	l_loader_start;
- *	unsigned int	l_loader_end;
- * };
- */
-
-#define CPU0_CTRL_OFFSET		0x100
-#define CPU7_CTRL_OFFSET		0x800
-#define CPU0_RVBARADDR_OFFSET		0x158
-#define CPU7_RVBARADDR_OFFSET		0x858
-
-#define CPU_CTRL_AARCH64_MODE		(1 << 7)
-
-#define SC_PERIPH_CLKEN3		0x230
-#define SC_PERIPH_RSTDIS3		0x334
-	.global	_start
-_start:
-	b	reset
-@ Android magic number: "BOOTMAGICNUMBER!"
-android_magic:
-	.word	0x544f4f42
-	.word	0x4947414d
-	.word	0x4d554e43
-	.word	0x21524542
-	.word	LLOADER_START		@ LLOADER_START in RAM
-	.word	0			@ LLOADER_END in RAM
-
-entries:
-	@ 5 entries with 7 words
-	.space	140
-
-	.align	7
-
-reset:
-	ldr	r8, =(0xf9800000 + 0x700)
-	str	r0, [r8]		@ download mode (1:usb,2:uart,0:boot)
-
-	ldr	r4, =0xf6504000		@ ACPU_CTRL register base
-	@ set RVBAR for cpu0
-	ldr	r5, =CPU0_RVBARADDR_OFFSET
-	ldr	r6, =LLOADER_BL1_BIN
-	mov	r6, r6, lsr #2
-	str	r6, [r4, r5]
-1:
-	ldr	r0, [r4, r5]
-	cmp	r0, r6
-	bne	1b
-
-	mov	r5, #CPU0_CTRL_OFFSET
-	mov	r6, #CPU7_CTRL_OFFSET
-2:
-	ldr	r0, [r4, r5]		@ Load ACPU_SC_CPUx_CTRL
-	orr	r0, r0, #CPU_CTRL_AARCH64_MODE
-	str	r0, [r4, r5]		@ Save to ACPU_SC_CPUx_CTRL
-	ldr	r0, [r4, r5]
-
-	add	r5, r5, #0x100		@ Iterate ACPU_SC_CPUx_CTRL
-	cmp	r5, r6
-	ble	2b
-
-	/*
-	 * Prepare UART2 & UART3 without baud rate initialization.
-	 * So always output on UART0 in l-loader.
-	 */
-	ldr	r4, =0xf70100e0		@ UART2_RXD IOMG register
-	mov	r0, #0
-	str	r0, [r4]
-	str	r0, [r4, #4]		@ UART2_TXD IOMG register
-	ldr	r0, [r4]
-
-	ldr	r4, =0xf7010188		@ UART3_RXD IOMG register
-	mov	r0, #1
-	str	r0, [r4]
-	str	r0, [r4, #4]		@ UART3_TXD IOMG register
-	ldr	r1, [r4]
-
-	ldr	r4, =0xf7030000		@ PERI_CTRL register base
-	@ By default, CLK_TXCO is the parent of CLK_UART3 in SC_CLK_SEL0
-
-	ldr	r5, =SC_PERIPH_RSTDIS3	@ unreset
-	ldr	r6, =SC_PERIPH_CLKEN3	@ enable PCLK
-	mov	r0, #(3 << 6)		@ bit'6' & bit'7' (UART2 & UART3)
-	str	r0, [r4, r5]
-	str	r0, [r4, r6]
-
-	@ execute warm reset to switch aarch64
-	mov	r2, #3
-	mcr	p15, 0, r2, c12, c0, 2
-	wfi
-panic:
-	b	panic
-
-str_aarch64:
-	.asciz	"\nSwitch to aarch64 mode. CPU0 executes at 0x"
diff --git a/uefi-tools/atf-build.sh b/uefi-tools/atf-build.sh
deleted file mode 100755
index 65d4dbc..0000000
--- a/uefi-tools/atf-build.sh
+++ /dev/null
@@ -1,239 +0,0 @@
-#!/bin/bash
-#
-# Builds ARM Trusted Firmware, and generates FIPs with UEFI and optionally
-# Trusted OS for the supported platforms.
-# Not intended to be called directly, invoked from uefi-build.sh.
-#
-# Board configuration is extracted from
-# parse-platforms.py and platforms.config.
-#
-
-. "$TOOLS_DIR"/common-functions
-OUTPUT_DIR="$PWD"/uefi-build
-
-ATF_BUILDVER=1
-
-function usage
-{
-	echo "usage:"
-	echo "atf-build.sh -e <EDK2 source directory> -t <UEFI build profile/toolchain> <platform>"
-	echo
-}
-
-function check_atf_buildver
-{
-	MAJOR=`grep "^VERSION_MAJOR" Makefile | sed 's/.*:= *\([0-9]*\).*/\1/'`
-	[ $? -ne 0 ] && return 1
-	MINOR=`grep "^VERSION_MINOR" Makefile | sed 's/.*:= *\([0-9]*\).*/\1/'`
-	[ $? -ne 0 ] && return 1
-
-	if [ "$MAJOR" -eq 1 -a "$MINOR" -ge 2 ]; then
-		ATF_BUILDVER=2
-	fi
-}
-
-function build_platform
-{
-	if [ X"$EDK2_DIR" = X"" ];then
-		echo "EDK2_DIR not set!" >&2
-		return 1
-	fi
-
-	check_atf_buildver || return 1
-
-	BUILD_ATF="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o build_atf`"
-	if [ X"$BUILD_ATF" = X"" ]; then
-		echo "Platform '$1' is not configured to build ARM Trusted Firmware."
-		return 0
-	fi
-
-	ATF_PLATFORM="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_platform`"
-	if [ X"$ATF_PLATFORM" = X"" ]; then
-		ATF_PLATFORM=$1
-	fi
-
-	#
-	# Read platform configuration
-	#
-	PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o longname`"
-	PLATFORM_ARCH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o arch`"
-	PLATFORM_IMAGE_DIR="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o uefi_image_dir`"
-	PLATFORM_BUILDFLAGS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_buildflags`"
-
-	if [ $VERBOSE -eq 1 ]; then
-		echo "PLATFORM_NAME=$PLATFORM_NAME"
-		echo "PLATFORM_ARCH=$PLATFORM_ARCH"
-		echo "PLATFORM_IMAGE_DIR=$PLATFORM_IMAGE_DIR"
-		echo "PLATFORM_BUILDFLAGS=$PLATFORM_BUILDFLAGS"
-	fi
-
-	unset BL30 BL31 BL32 BL33
-	BL30="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o scp_bin`"
-	if [ $ATF_BUILDVER -gt 1 ]; then
-		unset SCP_BL2
-		SCP_BL2=`search_packages_path "$BL30"`
-	fi
-	BL31="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o el3_bin`"
-	BL33="$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o uefi_bin`"
-
-	#
-	# Set up cross compilation variables (if applicable)
-	#
-	set_cross_compile
-	CROSS_COMPILE="$TEMP_CROSS_COMPILE"
-	echo "Building ARM Trusted Firmware for $PLATFORM_NAME - $BUILD_PROFILE"
-	echo "CROSS_COMPILE=\"$TEMP_CROSS_COMPILE\""
-
-	if [ X"$BL30" != X"" ]; then
-		BL30=`search_packages_path "$BL30"`
-	fi
-	if [ X"$BL31" != X"" ]; then
-		BL31=`search_packages_path "$BL31"`
-	fi
-
-	#
-	# BL32 requires more attention
-	# If TOS_DIR is not set, we assume user does not want a Trusted OS,
-	# even if the source directory and/or binary for it exists
-	#
-	if [ X"$TOS_DIR" != X"" ]; then
-		SPD="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_spd`"
-
-		TOS_BIN="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o tos_bin`"
-		if [ X"$TOS_BIN" != X"" ]; then
-			BL32=$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/$TOS_BIN
-		fi
-
-		if [ X"$SPD" != X"" ] && [ X"$BL32" != X"" ]; then
-			#
-			# Since SPD cannot be exported or undefined,
-			# we parametrise it here
-			#
-			SPD_OPTION="SPD=$SPD"
-		else
-			echo "WARNING:	Proceeding without Trusted OS!"
-			echo "		Please specify both ATF_SPD and TOS_BIN"
-			echo "		if you wish to use a Trusted OS!"
-		fi
-	else
-	#
-	# Since TOS_DIR is not set, user does not want a Trusted OS
-	# even if the source directory and/or binary for it exists.
-	# Next, Check whether user wants secure partition image.
-	# If SPM_BIN is set then include pre-built secure partition image as a
-	# BL32 Image and implicitly set SPM=1.
-	#
-		SPM_BIN="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o spm_bin`"
-
-		if [ X"$SPM_BIN" != X"" ]; then
-			BL32=$WORKSPACE/Build/StandaloneSmmPkg/$BUILD_PROFILE/FV/$SPM_BIN
-			PLATFORM_BUILDFLAGS="$PLATFORM_BUILDFLAGS SPM=1"
-		fi
-	# We assume that user does not want secure partition either.
-	# Todo: Revisit if either one of Trusted OS or Secure Partition Image is Mandatory.
-	fi
-
-
-
-	#
-	# Debug extraction handling
-	#
-	case "$BUILD_ATF" in
-	debug*)
-		DEBUG=1
-		BUILD_TYPE="debug"
-		;;
-	*)
-		DEBUG=0
-		BUILD_TYPE="release"
-		;;
-	esac
-
-	export BL30 BL31 BL32 BL33
-
-	echo "BL30=$BL30"
-	if [ $ATF_BUILDVER -gt 1 ] && [ X"$BL30" != X"" ]; then
-		export SCP_BL2
-		echo "SCP_BL2=$BL30"
-	fi
-	echo "BL31=$BL31"
-	echo "BL32=$BL32"
-	echo "BL33=$BL33"
-	echo "$SPD_OPTION"
-	echo "BUILD_TYPE=$BUILD_TYPE"
-
-	#
-	# If a build was done with BL32, and followed by another without,
-	# the BL32 component remains in fip.bin, so we delete the build dir
-	# contents before calling make
-	#
-	rm -rf build/"$ATF_PLATFORM/$BUILD_TYPE"/*
-
-	#
-	# Build ARM Trusted Firmware and create FIP
-	#
-	if [ $VERBOSE -eq 1 ]; then
-		echo "Calling ARM Trusted Firmware build:"
-		echo "CROSS_COMPILE="$CROSS_COMPILE" make -j$NUM_THREADS PLAT="$ATF_PLATFORM" $SPD_OPTION DEBUG=$DEBUG ${PLATFORM_BUILDFLAGS} all fip"
-	fi
-	CROSS_COMPILE="$CROSS_COMPILE" make -j$NUM_THREADS PLAT="$ATF_PLATFORM" $SPD_OPTION DEBUG=$DEBUG ${PLATFORM_BUILDFLAGS} all fip
-	if [ $? -eq 0 ]; then
-		#
-		# Copy resulting images to UEFI image dir
-		#
-		if [ $VERBOSE -eq 1 ]; then
-			echo "Copying bl1.bin and fip.bin to "$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/""
-		fi
-		cp -a build/"$ATF_PLATFORM/$BUILD_TYPE"/{bl1,fip}.bin "$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/"
-	else
-		return 1
-	fi
-}
-
-# Check to see if we are in a trusted firmware directory
-# refuse to continue if we aren't
-if [ ! -d bl32 ]
-then
-	echo "ERROR: we aren't in the arm-trusted-firmware directory."
-	usage
-	exit 1
-fi
-
-build=
-
-if [ $# = 0 ]
-then
-	usage
-	exit 1
-else
-	while [ "$1" != "" ]; do
-		case $1 in
-			"-e" )
-				shift
-				EDK2_DIR="$1"
-				;;
-			"/h" | "/?" | "-?" | "-h" | "--help" )
-				usage
-				exit
-				;;
-			"-t" )
-				shift
-				BUILD_PROFILE="$1"
-				;;
-			* )
-				build="$1"
-				;;
-		esac
-		shift
-	done
-fi
-
-if [ X"$build" = X"" ]; then
-	echo "No platform specified!" >&2
-	echo
-	usage
-	exit 1
-fi
-
-build_platform $build
-exit $?
diff --git a/uefi-tools/common-functions b/uefi-tools/common-functions
deleted file mode 100644
index 9d01ae1..0000000
--- a/uefi-tools/common-functions
+++ /dev/null
@@ -1,214 +0,0 @@
-#!/bin/bash
-
-RESULT_BUF=`echo -e ------------------------------------------------------------`
-RESULT_PASS_COUNT=0
-RESULT_FAIL_COUNT=0
-
-function result_log
-{
-	if [ $1 -eq 0 ]; then
-		RESULT_BUF="`printf \"%s\n%55s\tpass\" \"$RESULT_BUF\" \"$2\"`"
-		RESULT_PASS_COUNT=$(($RESULT_PASS_COUNT + 1))
-	else
-		RESULT_BUF="`printf \"%s\n%55s\tfail\" \"$RESULT_BUF\" \"$2\"`"
-		RESULT_FAIL_COUNT=$(($RESULT_FAIL_COUNT + 1))
-	fi
-}
-
-function result_print
-{
-	printf "%s" "$RESULT_BUF"
-	echo -e "\n------------------------------------------------------------"
-	printf "pass\t$RESULT_PASS_COUNT\n"
-	printf "fail\t$RESULT_FAIL_COUNT\n"
-
-	exit $RESULT_FAIL_COUNT
-}
-
-function get_build_arch
-{
-	case `uname -m` in
-	    arm*)
-	        BUILD_ARCH=ARM;;
-	    aarch64*)
-	        BUILD_ARCH=AARCH64;;
-	    i?86*)
-		BUILD_ARCH=IA32;;
-	    x86_64*)
-		BUILD_ARCH=X64;;
-	    *)
-	        BUILD_ARCH=other;;
-	esac
-}
-
-function set_cross_compile
-{
-	get_build_arch
-
-	echo "Target: $PLATFORM_ARCH"
-	echo "Build: $BUILD_ARCH"
- 	if [ "$PLATFORM_ARCH" = "$BUILD_ARCH" ]; then
-	    TEMP_CROSS_COMPILE=
-	else
-	    case "$PLATFORM_ARCH" in
-		AARCH64)
-                    if [ X"$CROSS_COMPILE_64" != X"" ]; then
-                        TEMP_CROSS_COMPILE="$CROSS_COMPILE_64"
-                    else
-                        TEMP_CROSS_COMPILE=aarch64-linux-gnu-
-                    fi
-                ;;
-		ARM)
-		    TEMP_CROSS_COMPILE=arm-linux-gnueabihf- ;;
-		IA32)
-		    TEMP_CROSS_COMPILE=x86_64-linux-gnu-
-		    for family in 6 5 4 3; do
-		        if i$family86-linux-gnu-as -version >/dev/null 2>&1;then
-		            TEMP_CROSS_COMPILE=i$family86-linux-gnu-
-		            break
-		        fi
-		    done
-		;;
-		X64)
-		    TEMP_CROSS_COMPILE=x86_64-linux-gnu- ;;
-		*)
-	            echo "Unsupported target architecture '$PLATFORM_ARCH'!" >&2
-		;;
-	    esac
-	fi
-}
-
-function get_gcc_version
-{
-	$1 -v >/dev/null 2>&1 || return 1
-	gcc_version=$($1 -dumpversion)
-	MAJVER=`echo $gcc_version | cut -d. -f1`
-
-	case $gcc_version in
-		4*)
-			echo GCC$(echo ${gcc_version} | awk -F. '{print $1$2}')
-			;;
-		*)
-			if [ "$MAJVER" -ge 5 ]; then
-			    # We only have a GCC5 build profile for now, so...
-			    # echo GCC$MAJVER
-			    echo GCC5
-			else
-			    echo "Unknown toolchain version '$gcc_version'" >&2
-			    echo "Attempting to build using GCC49 profile." >&2
-			    echo GCC49
-			fi
-			;;
-	esac
-
-	return 0
-}
-
-function get_clang_version
-{
-	clang_version=`$1 --version | head -1 | sed 's/^.*version\s*\([0-9]*\).\([0-9]*\).*/\1\2/g'`
-	case $clang_version in
-		35*)
-			echo "CLANG$clang_version"
-			;;
-		*)
-			echo "Unknown toolchain version '$clang_version'" >&2
-			echo "Attempting to build using CLANG35 profile." >&2
-			echo CLANG35
-			;;
-	esac
-}
-
-function download_patch_openssl
-{
-    OPENSSL_VER=`ls EDKII_openssl-*.patch | sed 's/^.*-\([0-9.a-z]*\).patch/\1/'`
-    OPENSSL_TAR=openssl-${OPENSSL_VER}.tar.gz
-    OPENSSL_URL=http://www.openssl.org/source/${OPENSSL_TAR}
-    OPENSSL_DIR=openssl-${OPENSSL_VER}
-    OPENSSL_PATCH=EDKII_openssl-${OPENSSL_VER}.patch
-
-    if [ -e "$WORKSPACE"/CryptoPkg/Include/openssl/opensslconf.h ]; then
-        echo "OpenSSL already imported!"
-        return 0
-    fi
-
-    # Use cached copy if available
-    if [ -f "$WORKSPACE"/LinaroPkg/"$OPENSSL_TAR" ]; then
-	tar xzf "$WORKSPACE"/LinaroPkg/"$OPENSSL_TAR"
-    else
-	wget -O - -q ${OPENSSL_URL} | tar xzf -
-    fi
-
-    echo "Importing OpenSSL $OPENSSL_VER"
-    ( cd ${OPENSSL_DIR}; patch -p1 -i ../${OPENSSL_PATCH} )
-    ./Install.sh
-
-    if [ $? -eq 0 ]; then
-	OPENSSL_CONFIGURED=TRUE
-    else
-	echo "OpenSSL $OPENSSL_VER import failed!" >&2
-	rm -rf $OPENSSL_TAR $OPENSSL_DIR
-	return 1
-    fi
-}
-
-function clone_process_openssl
-{
-    if [ -e openssl/include/openssl/opensslconf.h ]; then
-        echo "OpenSSL already imported!"
-        return 0
-    fi
-
-    OPENSSL_VER=`git ls-remote --tags git://github.com/openssl/openssl.git | awk '{print $2;}' | sed 's-^refs/tags/--g' | grep -v '\^{}$' | grep '^OpenSSL' | grep -v '^OpenSSL_FIPS' | tail -1 | sed -n 's/^OpenSSL_\([0-9]*\)_\([0-9]*\)_\([0-9.a-z]*\)$/openssl-\1.\2.\3\n/p'`
-    OPENSSL_TAR="$OPENSSL_VER.tar.gz"
-    if [ -z "$OPENSSL_TAR" ]; then
-        return 1
-    fi
-    OPENSSL_URL=http://www.openssl.org/source/${OPENSSL_TAR}
-    if [ ! -f "$OPENSSL_TAR" ]; then
-        wget -q ${OPENSSL_URL}
-    else
-        rm -rf openssl
-    fi
-    tar xzf "$OPENSSL_TAR"
-    mv "$OPENSSL_VER" openssl
-    # perl process_files.pl # not needed and not currently working
-    return $?
-}
-
-function import_openssl
-{
-    # Don't re-import if already done
-    if [ "$OPENSSL_CONFIGURED" = "TRUE" ]; then
-	echo "Using existing OpenSSL $OPENSSL_VER"
-	return 0
-    fi
-
-    cd CryptoPkg/Library/OpensslLib/
-    if [ -f EDKII_openssl-*.patch ]; then
-        download_patch_openssl
-    else
-        clone_process_openssl
-    fi
-    RET=$?
-    cd - >/dev/null
-    return $RET
-}
-
-function search_packages_path
-{
-    file="$1"
-
-    IFS=:
-    for dir in $PACKAGES_PATH; do
-	if [ -e "$dir/$file" ]; then
-	    echo "$dir/$file"
-	    unset IFS
-	    return 0
-	fi
-    done
-
-    echo "$file not found in any directory on PACKAGES_PATH!" >&2
-    unset IFS
-    return 1
-}
diff --git a/uefi-tools/edk2-build.sh b/uefi-tools/edk2-build.sh
deleted file mode 100755
index 3e218b3..0000000
--- a/uefi-tools/edk2-build.sh
+++ /dev/null
@@ -1,401 +0,0 @@
-#!/bin/bash
-
-#
-# edk2-build.sh: evolution of uefi-build.sh for edk2-platforms
-#
-
-unset MAKEFLAGS  # BaseTools not safe to build parallel, prevent env overrides
-
-TOOLS_DIR="`dirname $0`"
-TOOLS_DIR="`readlink -f \"$TOOLS_DIR\"`"
-export TOOLS_DIR
-. "$TOOLS_DIR"/common-functions
-PLATFORM_CONFIG="-c $TOOLS_DIR/edk2-platforms.config"
-ARCH=
-VERBOSE=0                  # Override with -v
-ATF_DIR=
-TOS_DIR=
-TOOLCHAIN="gcc"            # Override with -T
-WORKSPACE=
-EDK2_DIR=
-PLATFORMS_DIR=
-NON_OSI_DIR=
-IMPORT_OPENSSL=TRUE
-OPENSSL_CONFIGURED=FALSE
-
-# Number of threads to use for build
-export NUM_THREADS=$((`getconf _NPROCESSORS_ONLN` + `getconf _NPROCESSORS_ONLN`))
-
-function do_build
-{
-	PLATFORM_ARCH=`echo $board | cut -s -d: -f2`
-	if [ -n "$PLATFORM_ARCH" ]; then
-		board=`echo $board | cut -d: -f1`
-	else
-		PLATFORM_ARCH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o arch`"
-	fi
-	PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o longname` ($PLATFORM_ARCH)"
-	if [ -z "$PLATFORM_ARCH" ]; then
-		echo "Unknown target architecture - aborting!" >&2
-		return 1
-	fi
-	PLATFORM_PREBUILD_CMDS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o prebuild_cmds`"
-	PLATFORM_BUILDFLAGS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o buildflags`"
-	PLATFORM_BUILDFLAGS="$PLATFORM_BUILDFLAGS ${EXTRA_OPTIONS[@]}"
-	PLATFORM_BUILDCMD="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o buildcmd`"
-	PLATFORM_DSC="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o dsc`"
-	PLATFORM_PACKAGES_PATH=""
-	COMPONENT_INF="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o inf`"
-
-	TEMP_PACKAGES_PATH="$GLOBAL_PACKAGES_PATH:`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o packages_path`"
-	IFS=:
-	for path in "$TEMP_PACKAGES_PATH"; do
-		case "$path" in
-			/*)
-				PLATFORM_PACKAGES_PATH="$PLATFORM_PACKAGES_PATH:$path"
-			;;
-			*)
-				PLATFORM_PACKAGES_PATH="$PLATFORM_PACKAGES_PATH:$PWD/$path"
-			;;
-	        esac
-	done
-	unset IFS
-
-	if [ $VERBOSE -eq 1 ]; then
-		echo "Setting build parallellism to $NUM_THREADS processes"
-		echo "PLATFORM_NAME=$PLATFORM_NAME"
-		echo "PLATFORM_PREBUILD_CMDS=$PLATFORM_PREBUILD_CMDS"
-		echo "PLATFORM_BUILDFLAGS=$PLATFORM_BUILDFLAGS"
-		echo "PLATFORM_BUILDCMD=$PLATFORM_BUILDCMD"
-		echo "PLATFORM_DSC=$PLATFORM_DSC"
-		echo "PLATFORM_ARCH=$PLATFORM_ARCH"
-		echo "PLATFORM_PACKAGES_PATH=$PLATFORM_PACKAGES_PATH"
-	fi
-
-	set_cross_compile
-	CROSS_COMPILE="$TEMP_CROSS_COMPILE"
-
-	echo "Building $PLATFORM_NAME - $PLATFORM_ARCH"
-	echo "CROSS_COMPILE=\"$TEMP_CROSS_COMPILE\""
-	echo "$board"_BUILDFLAGS="'$PLATFORM_BUILDFLAGS'"
-
-	if [ "$TARGETS" == "" ]; then
-		TARGETS=( RELEASE )
-	fi
-
-	case $TOOLCHAIN in
-		"gcc")
-			PLATFORM_TOOLCHAIN=`get_gcc_version "$CROSS_COMPILE"gcc`
-			;;
-		"clang")
-			PLATFORM_TOOLCHAIN=`get_clang_version clang`
-			;;
-		*)
-			# Use command-line specified profile directly
-			PLATFORM_TOOLCHAIN=$TOOLCHAIN
-			;;
-	esac
-	echo "PLATFORM_TOOLCHAIN is ${PLATFORM_TOOLCHAIN}"
-
-	export ${PLATFORM_TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE
-	echo "Toolchain prefix: ${PLATFORM_TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE"
-
-	export PACKAGES_PATH="$PLATFORM_PACKAGES_PATH"
-	for target in "${TARGETS[@]}" ; do
-		if [ X"$PLATFORM_PREBUILD_CMDS" != X"" ]; then
-			echo "Run pre-build commands:"
-			if [ $VERBOSE -eq 1 ]; then
-				echo "  ${PLATFORM_PREBUILD_CMDS}"
-			fi
-			eval ${PLATFORM_PREBUILD_CMDS}
-		fi
-
-		if [ -n "$COMPONENT_INF" ]; then
-			# Build a standalone component
-			if [ $VERBOSE -eq 1 ]; then
-				echo "build -n $NUM_THREADS -a \"$PLATFORM_ARCH\" -t ${PLATFORM_TOOLCHAIN} -p \"$PLATFORM_DSC\"" \
-					"-m \"$COMPONENT_INF\" -b "$target" ${PLATFORM_BUILDFLAGS}"
-			fi
-			build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${PLATFORM_TOOLCHAIN} -p "$PLATFORM_DSC" \
-				-m "$COMPONENT_INF" -b "$target" ${PLATFORM_BUILDFLAGS}
-		else
-			# Build a platform
-			if [ $VERBOSE -eq 1 ]; then
-				echo "build -n $NUM_THREADS -a \"$PLATFORM_ARCH\" -t ${PLATFORM_TOOLCHAIN} -p \"$PLATFORM_DSC\"" \
-					"-b "$target" ${PLATFORM_BUILDFLAGS}"
-			fi
-			build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${PLATFORM_TOOLCHAIN} -p "$PLATFORM_DSC" \
-				-b "$target" ${PLATFORM_BUILDFLAGS}
-		fi
-
-		RESULT=$?
-		if [ $RESULT -eq 0 ]; then
-			if [ X"$TOS_DIR" != X"" ]; then
-				pushd $TOS_DIR >/dev/null
-				if [ $VERBOSE -eq 1 ]; then
-					echo "$TOOLS_DIR/tos-build.sh -e "$EDK2_DIR" -t "$target"_${PLATFORM_TOOLCHAIN} $board"
-				fi
-				$TOOLS_DIR/tos-build.sh -e "$EDK2_DIR" -t "$target"_${PLATFORM_TOOLCHAIN} $board
-				RESULT=$?
-				popd >/dev/null
-			fi
-		fi
-		if [ $RESULT -eq 0 ]; then
-			if [ X"$ATF_DIR" != X"" ]; then
-				pushd $ATF_DIR >/dev/null
-				if [ $VERBOSE -eq 1 ]; then
-					echo "$TOOLS_DIR/atf-build.sh -e "$EDK2_DIR" -t "$target"_${PLATFORM_TOOLCHAIN} $board"
-				fi
-				$TOOLS_DIR/atf-build.sh -e "$EDK2_DIR" -t "$target"_${PLATFORM_TOOLCHAIN} $board
-				RESULT=$?
-				popd >/dev/null
-			fi
-		fi
-		result_log $RESULT "$PLATFORM_NAME $target"
-	done
-	unset PACKAGES_PATH
-}
-
-
-function configure_paths
-{
-	WORKSPACE="$PWD"
-
-	# Check to see if we are in a UEFI repository
-	# refuse to continue if we aren't
-	if [ ! -d "$EDK2_DIR"/BaseTools ]
-	then
-		if [ -d "$PWD"/edk2/BaseTools ]; then
-			EDK2_DIR="$PWD"/edk2
-		else
-			echo "ERROR: can't locate the edk2 directory" >&2
-			echo "       please specify -e/--edk2-dir" >&2
-			exit 1
-		fi
-	fi
-
-	GLOBAL_PACKAGES_PATH="$EDK2_DIR"
-
-	# locate edk2-platforms
-	if [ -z "$PLATFORMS_DIR" -a -d "$PWD"/edk2-platforms ]; then
-		PLATFORMS_DIR="$PWD"/edk2-platforms
-	fi
-	if [ -n "$PLATFORMS_DIR" ]; then
-		GLOBAL_PACKAGES_PATH="$GLOBAL_PACKAGES_PATH:$PLATFORMS_DIR"
-	fi
-
-	# locate edk2-non-osi
-	if [ -z "$NON_OSI_DIR" -a -d "$PWD"/edk2-non-osi ]; then
-		NON_OSI_DIR="$PWD"/edk2-non-osi
-	fi
-	if [ -n "$NON_OSI_DIR" ]; then
-		GLOBAL_PACKAGES_PATH="$GLOBAL_PACKAGES_PATH:$NON_OSI_DIR"
-	fi
-
-	# locate arm-trusted-firmware
-	if [ -z "$ATF_DIR" -a -d "$PWD"/arm-trusted-firmware ]; then
-		ATF_DIR="$PWD"/arm-trusted-firmware
-	fi
-
-	export WORKSPACE
-}
-
-
-function prepare_build
-{
-	get_build_arch
-	export ARCH=$BUILD_ARCH
-
-	export ARCH
-	cd $EDK2_DIR
-	PACKAGES_PATH=$GLOBAL_PACKAGES_PATH . edksetup.sh --reconfig
-	if [ $? -ne 0 ]; then
-		echo "Sourcing edksetup.sh failed!" >&2
-		exit 1
-	fi
-	if [ $VERBOSE -eq 1 ]; then
-		echo "Building BaseTools"
-	fi
-	make -C BaseTools
-	RET=$?
-	cd -
-	if [ $RET -ne 0 ]; then
-		echo " !!! BaseTools failed to build !!! " >&2
-		exit 1
-	fi
-
-	if [ "$IMPORT_OPENSSL" = "TRUE" ]; then
-		cd $EDK2_DIR
-		import_openssl
-		if [ $? -ne 0 ]; then
-			echo "Importing OpenSSL failed - aborting!" >&2
-			echo "  specify --no-openssl to attempt build anyway." >&2
-			exit 1
-		fi
-		cd $WORKSPACE
-	fi
-}
-
-
-function usage
-{
-	echo "usage:"
-	echo -n "uefi-build.sh [-b DEBUG | RELEASE] [ all "
-	for board in "${boards[@]}" ; do
-	    echo -n "| $board "
-	done
-	echo "]"
-	printf "%8s\tbuild %s\n" "all" "all supported platforms"
-	for board in "${boards[@]}" ; do
-		PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o longname`"
-		printf "%8s\tbuild %s\n" "$board" "${PLATFORM_NAME}"
-	done
-}
-
-#
-# Since we do a command line validation on whether specified platforms exist or
-# not, do a first pass of command line to see if there is an explicit config
-# file there to read valid platforms from.
-#
-commandline=( "$@" )
-i=0
-for arg;
-do
-	if [ $arg == "-c" ]; then
-		FILE_ARG=${commandline[i + 1]}
-		if [ ! -f "$FILE_ARG" ]; then
-			echo "ERROR: configuration file '$FILE_ARG' not found" >&2
-			exit 1
-		fi
-		case "$FILE_ARG" in
-			/*)
-				PLATFORM_CONFIG="-c $FILE_ARG"
-			;;
-			*)
-				PLATFORM_CONFIG="-c `readlink -f \"$FILE_ARG\"`"
-			;;
-		esac
-		echo "Platform config file: '$FILE_ARG'"
-	fi
-	i=$(($i + 1))
-done
-
-export PLATFORM_CONFIG
-
-builds=()
-boards=()
-boardlist="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG shortlist`"
-for board in $boardlist; do
-    boards=(${boards[@]} $board)
-done
-
-NUM_TARGETS=0
-
-while [ "$1" != "" ]; do
-	case $1 in
-		-1)     # Disable build parallellism
-			NUM_THREADS=1
-			;;
-		-a | --arm-tf-dir)
-			shift
-			ATF_DIR="`readlink -f $1`"
-			;;
-		-c)     # Already parsed above - skip this + option
-			shift
-			;;
-		-b | --build-target)
-			shift
-			echo "Adding Build target: $1"
-			TARGETS=(${TARGETS[@]} $1)
-			;;
-		-D)     # Pass through as -D option to 'build'
-			shift
-			echo "Adding Macro: -D $1"
-			EXTRA_OPTIONS=(${EXTRA_OPTIONS[@]} "-D" $1)
-			;;
-		-e | --edk2-dir)
-			shift
-			export EDK2_DIR="`readlink -f $1`"
-			;;
-		-h | --help)
-			usage
-			exit
-			;;
-		--no-openssl)
-			IMPORT_OPENSSL=FALSE
-			;;
-		-n | --non-osi-dir)
-			shift
-			NON_OSI_DIR="`readlink -f $1`"
-			;;
-		-p | --platforms-dir)
-			shift
-			PLATFORMS_DIR="`readlink -f $1`"
-			;;
-		-s | --tos-dir)
-			shift
-			export TOS_DIR="`readlink -f $1`"
-			;;
-		-T)     # Set specific toolchain tag, or clang/gcc for autoselection
-			shift
-			echo "Setting toolchain tag to '$1'"
-			TOOLCHAIN="$1"
-			;;
-		-v)
-			VERBOSE=1
-			;;
-		all)    # Add all targets in configuration file to list
-			builds=(${boards[@]})
-			NUM_TARGETS=$(($NUM_TARGETS + 1))
-			;;
-		*)      # Try to match target in configuration file, add to list
-			MATCH=0
-			for board in "${boards[@]}" ; do
-				if [ "`echo $1 | cut -d: -f1`" == $board ]; then
-					MATCH=1
-					builds=(${builds[@]} "$1")
-					break
-				fi
-			done
-
-			if [ $MATCH -eq 0 ]; then
-				echo "unknown arg $1"
-				usage
-				exit 1
-			fi
-			NUM_TARGETS=$(($NUM_TARGETS + 1))
-			;;
-	esac
-	shift
-done
-
-if [ $NUM_TARGETS -le  0 ]; then
-	echo "No targets specified - exiting!" >&2
-	exit 0
-fi
-
-export VERBOSE
-
-configure_paths
-
-prepare_build
-
-if [[ "${EXTRA_OPTIONS[@]}" != *"FIRMWARE_VER"* ]]; then
-	if test -d .git && head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
-		FIRMWARE_VER=`git rev-parse --short HEAD`
-		if ! git diff-index --quiet HEAD --; then
-			FIRMWARE_VER="${FIRMWARE_VER}-dirty"
-		fi
-		EXTRA_OPTIONS=( ${EXTRA_OPTIONS[@]} "-D" FIRMWARE_VER=$FIRMWARE_VER )
-		if [ $VERBOSE -eq 1 ]; then
-			echo "FIRMWARE_VER=$FIRMWARE_VER"
-			echo "EXTRA_OPTIONS=$EXTRA_OPTIONS"
-		fi
-	fi
-fi
-
-for board in "${builds[@]}" ; do
-	do_build
-done
-
-result_print
diff --git a/uefi-tools/edk2-platforms.config b/uefi-tools/edk2-platforms.config
deleted file mode 100644
index be74327..0000000
--- a/uefi-tools/edk2-platforms.config
+++ /dev/null
@@ -1,138 +0,0 @@
-# Platform build configurations for Linaro EDK2 builds
-# ====================================================
-# The configuration file format is extremely simplistic:
-# - Each platform has a short name.
-# - A platform entry starts by the short name held in square brackets, '[]'
-# - Within each entry, all options are described in a NAME=VALUE scheme,
-#   with the name being whatever comes before the first '=' on the line,
-#   and the value being everything that comes after it.
-#
-# Mandatory options:
-# - LONGNAME		A more descriptive name of the platform.
-# - DSC			Pointer to the EDK2 build description file. (The
-#			pandaboard is excused, all other ports must have this.)
-# - ARCH		String describing the architecture to build for.
-#			Currently supported are AARCH32 and AARCH64.
-# - UEFI_BIN		Name of executable image produced.
-# - UEFI_IMAGE_DIR	Build output directory name, relative to 'Build'.
-#
-# Options for Trusted OS
-# Note that OP-TEE (https://github.com/OP-TEE/optee_os) is the only currently
-# supported Trusted OS
-# - BUILD_TOS		Set to "yes" if the build should automatically build
-#   			Trusted OS, mainly for ARM Trusted Firmware.
-#			If this is set, you must also set ATF_SPD!
-#			Else we will not know which specific Trusted OS to
-#			build.
-#			Set to "debug" to create a debug build.
-# - TOS_PLATFORM	Platform name for Trusted OS build, if
-#   			different from ARM Trusted Firmware platform
-#			or UEFI platform name.
-# - TOS_PLATFORM_FLAVOR	If a core platform has multiple flavors, specify which
-#			flavor here.
-#
-# Options for ARM Trusted Firmware platforms
-# - BUILD_ATF		Set to "yes" if the build should automatically build
-#   			ARM Trusted Firmware and a fip containing UEFI image.
-#			Set to "debug" to create a debug build.
-# - ATF_PLATFORM	Platform name for ARM Trusted Firmware build, if
-#   			different from UEFI platform name.
-# - SCP_BIN		SCP image to pass to ARM Trusted Firmware.
-# - TOS_BIN		Trusted OS image to pass to ARM Trusted Firmware.
-#			The path is relative to
-#			$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/.
-#			To actually build the Trusted OS, you must also set
-#			ATF_SPD.
-# - ATF_SPD		Name of Secure Payload Dispatcher
-#			To actually build the Trusted OS, you must also set
-#			TOS_BIN.
-#
-# Optional options:
-# - BUILDFLAGS		Any special flags you want to pass to the build command.
-# - ATF_BUILDFLAGS	Any special flags you want to pass to the ARM Trusted
-#			Firmware build command.
-# - TOS_BUILDFLAGS	Any special flags you want to pass to the Trusted OS
-#			build command.
-# - EXTRA_FILES		Any additional files to be copied to output dir.
-# - PREBUILD_CMDS	Any commands you want to execute before the build step.
-# - POSTBUILD_CMDS	Any commands you want to execute after the build step.
-# - PACKAGES_PATH	Additional directories to search for packages under.
-# - INF                 Point to a .inf (in addition to a .dsc) in order to
-#                       build a single component (standalone driver/app).
-#
-
-[juno]
-LONGNAME=aarch64 Juno
-DSC=Platform/ARM/JunoPkg/ArmJuno.dsc
-BUILDFLAGS=
-ARCH=AARCH64
-BUILD_ATF=yes
-SCP_BIN=Platform/ARM/Juno/bl30.bin
-UEFI_BIN=BL33_AP_UEFI.fd
-UEFI_IMAGE_DIR=ArmJuno
-
-# ARM FVP BASE AEMv8-A model
-[fvp]
-LONGNAME=aarch64 FVP RTSM
-DSC=Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc
-BUILDFLAGS=-D EDK2_ENABLE_SMSC_91X=1 -D EDK2_ENABLE_PL111=1
-ARCH=AARCH64
-BUILD_ATF=yes
-UEFI_BIN=FVP_AARCH64_EFI.fd
-UEFI_IMAGE_DIR=ArmVExpress-FVP-AArch64
-
-[tc2]
-LONGNAME=Versatile Express TC2
-BUILDFLAGS=-D ARM_BIGLITTLE_TC2=1
-DSC=Platform/ARM/VExpressPkg/ArmVExpress-CTA15-A7.dsc
-ARCH=ARM
-
-[overdrive]
-LONGNAME=AMD Overdrive
-DSC=Platform/AMD/OverdriveBoard/OverdriveBoard.dsc
-ARCH=AARCH64
-
-[overdrive1000]
-LONGNAME=SoftIron Overdrive 1000
-DSC=Platform/SoftIron/Overdrive1000Board/Overdrive1000Board.dsc
-ARCH=AARCH64
-
-[cello]
-LONGNAME=LeMaker Cello
-DSC=Platform/LeMaker/CelloBoard/CelloBoard.dsc
-ARCH=AARCH64
-
-[hikey]
-LONGNAME=HiKey
-DSC=Platform/Hisilicon/HiKey/HiKey.dsc
-ARCH=AARCH64
-
-[d02]
-LONGNAME=Hisilicon D02
-DSC=Platform/Hisilicon/D02/Pv660D02.dsc
-ARCH=AARCH64
-
-[d03]
-LONGNAME=Hisilicon D03
-DSC=Platform/Hisilicon/D03/D03.dsc
-ARCH=AARCH64
-
-[d05]
-LONGNAME=HiSilicon D05
-DSC=Platform/Hisilicon/D05/D05.dsc
-ARCH=AARCH64
-
-[armada70x0]
-LONGNAME=Marvell Armada 70x0
-DSC=Platform/Marvell/Armada/Armada70x0.dsc
-ARCH=AARCH64
-
-[chaoskey]
-LONGNAME=Altus Metrum ChaosKey RNG
-DSC=Silicon/Openmoko/Openmoko.dsc
-ARCH=AARCH64
-
-[beagle]
-LONGNAME=Beagleboard (original)
-DSC=BeagleBoardPkg/BeagleBoardPkg.dsc
-ARCH=ARM
diff --git a/uefi-tools/edk2-to-git-am.sh b/uefi-tools/edk2-to-git-am.sh
deleted file mode 100755
index d3f8a27..0000000
--- a/uefi-tools/edk2-to-git-am.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-#
-# Convert one or more git patches that have had it's CR:s stripped out by SMTP
-# into something th
-
-if [ $# -lt 1 ]; then
-  echo "usage: `basename $0` <filename>" >&2
-  exit 1
-fi
-
-convert_file()
-{
-  sed -i "s/$/\r/g" "$1"
-  sed -i "s:^\(---\|+++ \)\(.*\)\r$:\1\2:g" "$1"
-}
-
-while [ $# -gt 0 ]; do
-  convert_file "$1"
-  shift
-done
diff --git a/uefi-tools/handy-snippets.sh b/uefi-tools/handy-snippets.sh
deleted file mode 100644
index 834ca74..0000000
--- a/uefi-tools/handy-snippets.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# First step in looking for duplicate file GUIDs
-#
-# find . -name "*.inf" | \
-#   xargs grep -H FILE_GUID | \
-#   sed 's/^\(.*\):[ \t]*FILE_GUID[ \t]*=[ \t]*\([a-f.A-F.0-9.-]*\).*\r$/\2 \1/' | \
-#   sort
-#
diff --git a/uefi-tools/opteed-build.sh b/uefi-tools/opteed-build.sh
deleted file mode 100755
index 702860e..0000000
--- a/uefi-tools/opteed-build.sh
+++ /dev/null
@@ -1,158 +0,0 @@
-#!/bin/bash
-#
-# Builds OP-TEE Trusted OS.
-# Not intended to be called directly, invoked from tos-build.sh.
-#
-# Board configuration is extracted from
-# parse-platforms.py and platforms.config.
-#
-
-. "$TOOLS_DIR"/common-functions
-
-export CFG_TEE_CORE_LOG_LEVEL=2  # 0=none 1=err 2=info 3=debug 4=flow
-
-function usage
-{
-	echo "usage:"
-	echo "opteed-build.sh -e <EDK2 source directory> -t <UEFI build profile/toolchain> <platform>"
-	echo
-}
-
-function build_platform
-{
-	unset CFG_ARM64_core PLATFORM PLATFORM_FLAVOR DEBUG
-	TOS_PLATFORM="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o tos_platform`"
-	if [ X"$TOS_PLATFORM" = X"" ]; then
-		TOS_PLATFORM="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_platform`"
-		if [ X"$TOS_PLATFORM" = X"" ]; then
-			TOS_PLATFORM=$1
-		fi
-	fi
-	TOS_PLATFORM_FLAVOR="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o tos_platform_flavor`"
-
-	#
-	# Read platform configuration
-	#
-	PLATFORM_ARCH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o arch`"
-	PLATFORM_IMAGE_DIR="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o uefi_image_dir`"
-	PLATFORM_BUILDFLAGS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o tos_buildflags`"
-
-	if [ $VERBOSE -eq 1 ]; then
-		echo "PLATFORM_ARCH=$PLATFORM_ARCH"
-		echo "PLATFORM_IMAGE_DIR=$PLATFORM_IMAGE_DIR"
-		echo "PLATFORM_BUILDFLAGS=$PLATFORM_BUILDFLAGS"
-	fi
-
-	#
-	# Set up cross compilation variables (if applicable)
-	#
-	# OP-TEE requires both 64- and 32-bit compilers for a 64-bit build
-	# For details, visit
-	# https://github.com/OP-TEE/optee_os/blob/master/documentation/build_system.md#cross_compile-cross-compiler-selection
-	#
-	set_cross_compile
-	if [ "$PLATFORM_ARCH" = "AARCH64" ]; then
-		export CFG_ARM64_core=y
-		export CROSS_COMPILE_core="$TEMP_CROSS_COMPILE"
-		export CROSS_COMPILE_ta_arm64="$TEMP_CROSS_COMPILE"
-		PLATFORM_ARCH="ARM"
-		set_cross_compile
-		PLATFORM_ARCH="AARCH64"
-		echo "CFG_ARM64_core=$CFG_ARM64_core"
-		echo "CROSS_COMPILE_ta_arm64=$CROSS_COMPILE_ta_arm64"
-	else
-		export CFG_ARM64_core=n
-	fi
-	export CROSS_COMPILE="$TEMP_CROSS_COMPILE"
-	echo "CROSS_COMPILE=$CROSS_COMPILE"
-	echo "CROSS_COMPILE_core=$CROSS_COMPILE_core"
-
-	#
-	# Set up build variables
-	#
-	BUILD_TOS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o build_tos`"
-	case "$BUILD_TOS" in
-	debug*)
-		export DEBUG=1
-		echo "PROFILE=DEBUG"
-		;;
-	*)
-		export DEBUG=0
-		echo "PROFILE=RELEASE"
-		;;
-	esac
-
-	export PLATFORM=$TOS_PLATFORM
-	export PLATFORM_FLAVOR=$TOS_PLATFORM_FLAVOR
-	echo "PLATFORM=$PLATFORM"
-	echo "PLATFORM_FLAVOR=$PLATFORM_FLAVOR"
-	echo "CFG_TEE_CORE_LOG_LEVEL=$CFG_TEE_CORE_LOG_LEVEL"
-
-	#
-	# Build OP-TEE
-	#
-	if [ $VERBOSE -eq 1 ]; then
-		echo "Calling OP-TEE build:"
-	fi
-	make -j$NUM_THREADS ${PLATFORM_BUILDFLAGS}
-	if [ $? -eq 0 ]; then
-		#
-		# Copy resulting images to UEFI image dir
-		#
-		TOS_BIN="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o tos_bin`"
-		if [ $VERBOSE -eq 1 ]; then
-			echo "Copying '$TOS_BIN' to '$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/'"
-		fi
-		cp -a out/arm-plat-"$TOS_PLATFORM"/core/"$TOS_BIN" "$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/"
-	else
-		return 1
-	fi
-}
-
-# Check to see if we are in a trusted OS directory
-# refuse to continue if we aren't
-if [ ! -f documentation/optee_design.md ]
-then
-	echo "ERROR: we aren't in the optee_os directory."
-	usage
-	exit 1
-fi
-
-build=
-
-if [ $# = 0 ]
-then
-	usage
-	exit 1
-else
-	while [ "$1" != "" ]; do
-		case $1 in
-			"-e" )
-				shift
-				EDK2_DIR="$1"
-				;;
-			"/h" | "/?" | "-?" | "-h" | "--help" )
-				usage
-				exit
-				;;
-			"-t" )
-				shift
-				BUILD_PROFILE="$1"
-				;;
-			* )
-				build="$1"
-				;;
-		esac
-		shift
-	done
-fi
-
-if [ X"$build" = X"" ]; then
-	echo "No platform specified!" >&2
-	echo
-	usage
-	exit 1
-fi
-
-build_platform $build
-exit $?
diff --git a/uefi-tools/parse-platforms.py b/uefi-tools/parse-platforms.py
deleted file mode 100755
index af44038..0000000
--- a/uefi-tools/parse-platforms.py
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/usr/bin/python
-
-import sys, os, argparse, ConfigParser
-
-default_filename='platforms.config'
-
-def list_platforms():
-    for p in platforms: print p
-
-def shortlist_platforms():
-    for p in platforms: print p,
-
-def get_images():
-    if args.platform:
-        try:
-            value = config.get(args.platform, "EXTRA_FILES")
-            print value,
-        except:
-            pass
-        try:
-            value = config.get(args.platform, "BUILD_ATF")
-            if value == "yes":
-                print "bl1.bin fip.bin"
-                return True
-        except:
-            try:
-                value = config.get(args.platform, "UEFI_BIN")
-                print value
-                return True
-            except:
-                print "No images found!"
-    else:
-        print "No platform specified!"
-
-    return False
-
-def get_option():
-    if args.platform:
-        if args.option:
-            try:
-                value = config.get(args.platform, args.option)
-                if value:
-                    print value
-                    return True
-            except:
-                return True   # Option not found, return True, and no output
-        else:
-            print "No option specified!"
-    else:
-        print "No platform specified!"
-    return False
-
-parser = argparse.ArgumentParser(description='Parses platform configuration for Linaro UEFI build scripts.')
-parser.add_argument('-c', '--config-file', help='Specify a non-default platform config file.', required=False)
-parser.add_argument('-p', '--platform', help='Read configuration for PLATFORM only.', required=False)
-parser.add_argument('command', action="store", help='Action to perform')
-parser.add_argument('-o', '--option', help='Option to retreive')
-
-args = parser.parse_args()
-if args.config_file:
-    config_filename = args.config_file
-else:
-    config_filename = os.path.dirname(os.path.realpath(sys.argv[0])) + '/' + default_filename
-
-config = ConfigParser.ConfigParser()
-config.read(config_filename)
-
-platforms = config.sections()
-
-commands = {"shortlist": shortlist_platforms,
-            "list": list_platforms,
-            "images": get_images,
-            "get": get_option}
-
-try:
-    retval = commands[args.command]()
-except:
-    print ("Unrecognized command '%s'" % args.command)
-
-if retval != True:
-    sys.exit(1)
diff --git a/uefi-tools/platforms.config b/uefi-tools/platforms.config
deleted file mode 100644
index deb02f4..0000000
--- a/uefi-tools/platforms.config
+++ /dev/null
@@ -1,306 +0,0 @@
-# Platform build configurations for Linaro EDK2 builds
-# ====================================================
-# The configuration file format is extremely simplistic:
-# - Each platform has a short name.
-# - A platform entry starts by the short name held in square brackets, '[]'
-# - Within each entry, all options are described in a NAME=VALUE scheme,
-#   with the name being whatever comes before the first '=' on the line,
-#   and the value being everything that comes after it.
-#
-# Mandatory options:
-# - LONGNAME		A more descriptive name of the platform.
-# - DSC			Pointer to the EDK2 build description file. (The
-#			pandaboard is excused, all other ports must have this.)
-# - ARCH		String describing the architecture to build for.
-#			Currently supported are AARCH32 and AARCH64.
-# - UEFI_BIN		Name of executable image produced.
-# - UEFI_IMAGE_DIR	Build output directory name, relative to 'Build'.
-#
-# Options for Trusted OS
-# Note that OP-TEE (https://github.com/OP-TEE/optee_os) is the only currently
-# supported Trusted OS
-# - BUILD_TOS		Set to "yes" if the build should automatically build
-#   			Trusted OS, mainly for ARM Trusted Firmware.
-#			If this is set, you must also set ATF_SPD!
-#			Else we will not know which specific Trusted OS to
-#			build.
-#			Set to "debug" to create a debug build.
-# - TOS_PLATFORM	Platform name for Trusted OS build, if
-#   			different from ARM Trusted Firmware platform
-#			or UEFI platform name.
-# - TOS_PLATFORM_FLAVOR	If a core platform has multiple flavors, specify which
-#			flavor here.
-#
-# Options for ARM Trusted Firmware platforms
-# - BUILD_ATF		Set to "yes" if the build should automatically build
-#   			ARM Trusted Firmware and a fip containing UEFI image.
-#			Set to "debug" to create a debug build.
-# - ATF_PLATFORM	Platform name for ARM Trusted Firmware build, if
-#   			different from UEFI platform name.
-# - SCP_BIN		SCP image to pass to ARM Trusted Firmware.
-# - TOS_BIN		Trusted OS image to pass to ARM Trusted Firmware.
-#			The path is relative to
-#			$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/.
-#			To actually build the Trusted OS, you must also set
-#			ATF_SPD.
-# - ATF_SPD		Name of Secure Payload Dispatcher
-#			To actually build the Trusted OS, you must also set
-#			TOS_BIN.
-# - SPM_BIN		Prebuilt Secure Partition image to pass to ARM Trusted Firmware.
-#			The path is relative to
-#			$EDK2_DIR/Build/StandaloneSmmPkg/$BUILD_PROFILE/FV/.
-#
-# Optional options:
-# - BUILDFLAGS		Any special flags you want to pass to the build command.
-# - ATF_BUILDFLAGS	Any special flags you want to pass to the ARM Trusted
-#			Firmware build command.
-# - TOS_BUILDFLAGS	Any special flags you want to pass to the Trusted OS
-#			build command.
-# - EXTRA_FILES		Any additional files to be copied to output dir.
-# - PREBUILD_CMDS	Any commands you want to execute before the build step.
-# - POSTBUILD_CMDS	Any commands you want to execute after the build step.
-# - PACKAGES_PATH	Additional directories to search for packages under.
-# - INF                 Point to a .inf (in addition to a .dsc) in order to
-#                       build a single component (standalone driver/app).
-#
-
-[juno]
-LONGNAME=aarch64 Juno
-DSC=OpenPlatformPkg/Platforms/ARM/Juno/ArmJuno.dsc
-BUILDFLAGS=
-ARCH=AARCH64
-BUILD_ATF=yes
-UEFI_BIN=BL33_AP_UEFI.fd
-UEFI_IMAGE_DIR=ArmJuno
-SCP_BIN=OpenPlatformPkg/Platforms/ARM/Juno/Binary/bl30.bin
-EXTRA_FILES=../../../../OpenPlatformPkg/Platforms/ARM/Juno/Binary/bl0.bin ../../../../OpenPlatformPkg/Platforms/ARM/Juno/Binary/Copying.txt
-
-# ARM FVP BASE AEMv8-A model
-[fvp_full]
-LONGNAME=aarch64 FVP RTSM with full perhiperhal set
-DSC=OpenPlatformPkg/Platforms/ARM/VExpress/ArmVExpress-FVP-AArch64.dsc
-BUILDFLAGS=-D EDK2_OUT_DIR=Build/ArmVExpress-FVP-AArch64-Full -D EDK2_ENABLE_SMSC_91X=1 -D EDK2_ENABLE_PL111=1
-ARCH=AARCH64
-UEFI_BIN=FVP_AARCH64_EFI.fd
-UEFI_IMAGE_DIR=ArmVExpress-FVP-AArch64-Full
-
-[fvp]
-LONGNAME=aarch64 FVP RTSM
-DSC=OpenPlatformPkg/Platforms/ARM/VExpress/ArmVExpress-FVP-AArch64.dsc
-BUILDFLAGS=-D EDK2_ENABLE_SMSC_91X=1
-ARCH=AARCH64
-BUILD_ATF=yes
-UEFI_BIN=FVP_AARCH64_EFI.fd
-UEFI_IMAGE_DIR=ArmVExpress-FVP-AArch64
-
-# ARM FVP BASE AEMv8-A model
-[fvp_mm_standalone]
-LONGNAME=FVP Base for MM Standalone image in secure world
-DSC=StandaloneSmmPkg/StandaloneSmmPkg.dsc
-ARCH=AARCH64
-UEFI_BIN=FVP_AARCH64_EFI_MM_STANDALONE.fd
-UEFI_IMAGE_DIR=ArmVExpress-FVP-AArch64-MM-Standalone
-
-[fvp_mm_normal]
-LONGNAME=FVP Base for UEFI image with MM support in normal world
-DSC=OpenPlatformPkg/Platforms/ARM/VExpress/ArmVExpress-FVP-AArch64.dsc
-BUILDFLAGS=-D EDK2_OUT_DIR=Build/ArmVExpress-FVP-AArch64-MM-Normal -D ARM_STANDALONE_MM_ENABLE=TRUE
-ARCH=AARCH64
-BUILD_ATF=debug
-UEFI_BIN=FVP_AARCH64_EFI.fd
-UEFI_IMAGE_DIR=ArmVExpress-FVP-AArch64-MM-Normal
-ATF_PLATFORM=fvp
-SPM_BIN=STANDALONESMM.fd
-ATF_BUILDFLAGS=ARM_BL31_IN_DRAM=1
-
-[tc2]
-LONGNAME=Versatile Express TC2
-BUILDFLAGS=-D ARM_BIGLITTLE_TC2=1
-DSC=OpenPlatformPkg/Platforms/ARM/VExpress/ArmVExpress-CTA15-A7.dsc
-ARCH=ARM
-UEFI_BIN=ARM_VEXPRESS_CTA15A7_EFI.fd
-UEFI_IMAGE_DIR=ArmVExpress-CTA15-A7
-
-[beagle]
-LONGNAME=BeagleBoard
-BUILDFLAGS=
-DSC=BeagleBoardPkg/BeagleBoardPkg.dsc
-ARCH=ARM
-
-[d01]
-LONGNAME=HiSilicon D01 Cortex-A15 16-cores
-BUILDFLAGS=-D EDK2_ARMVE_STANDALONE=1
-DSC=HisiPkg/D01BoardPkg/D01BoardPkg.dsc
-ARCH=ARM
-UEFI_BIN=D01.fd
-UEFI_IMAGE_DIR=D01
-
-[d01-intelbds]
-LONGNAME=HiSilicon D01 Cortex-A15 16-cores Intel Bds
-BUILDFLAGS=-D EDK2_ARMVE_STANDALONE=1 -D INTEL_BDS -D NO_LINUX_LOADER -D EDK2_OUT_DIR=Build/D01-IntelBds
-DSC=HisiPkg/D01BoardPkg/D01BoardPkg.dsc
-ARCH=ARM
-UEFI_BIN=D01.fd
-UEFI_IMAGE_DIR=D01
-
-[qemu]
-LONGNAME=QEMU ARM Emulator
-BUILDFLAGS=-D INTEL_BDS
-DSC=ArmVirtPkg/ArmVirtQemu.dsc
-ARCH=ARM
-UEFI_BIN=QEMU_EFI.fd
-UEFI_IMAGE_DIR=ArmVirtQemu-ARM
-
-[qemu64]
-LONGNAME=QEMU AArch64 Emulator
-BUILDFLAGS=-D INTEL_BDS
-DSC=ArmVirtPkg/ArmVirtQemu.dsc
-ARCH=AARCH64
-UEFI_BIN=QEMU_EFI.fd
-UEFI_IMAGE_DIR=ArmVirtQemu-AARCH64
-
-[mustang]
-LONGNAME=APM XGene Mustang
-BUILDFLAGS=
-DSC=ArmPlatformPkg/APMXGenePkg/APMXGene-Mustang.dsc
-ARCH=AARCH64
-UEFI_BIN=APMXGENE-MUSTANG.fd SEC_APMXGENE-MUSTANG.fd
-UEFI_IMAGE_DIR=APMXGene-Mustang
-
-[overdrive]
-LONGNAME=AMD Overdrive
-BUILDFLAGS=-D INTEL_BDS
-DSC=OpenPlatformPkg/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc
-ARCH=AARCH64
-PACKAGES_PATH=OpenPlatformPkg/Platforms/AMD/Styx/Binary
-UEFI_BIN=STYX_ROM.fd
-UEFI_IMAGE_DIR=Overdrive
-
-[overdrive1000]
-LONGNAME=SoftIron Overdrive 1000
-BUILDFLAGS=-D INTEL_BDS
-DSC=OpenPlatformPkg/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.dsc
-ARCH=AARCH64
-PACKAGES_PATH=OpenPlatformPkg/Platforms/AMD/Styx/Binary
-UEFI_BIN=OVERDRIVE1000_ROM.fd
-UEFI_IMAGE_DIR=Overdrive1000Board
-
-[cello]
-LONGNAME=LeMaker Cello
-BUILDFLAGS=-D INTEL_BDS
-DSC=OpenPlatformPkg/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc
-ARCH=AARCH64
-PACKAGES_PATH=OpenPlatformPkg/Platforms/AMD/Styx/Binary
-UEFI_BIN=STYX_ROM.fd
-UEFI_IMAGE_DIR=Cello
-
-# NOTE: If using upstream ATF, i.e.
-# https://github.com/ARM-software/arm-trusted-firmware
-# please set TOS_BIN=tee-pager.bin
-[hikey]
-LONGNAME=CircuitCo HiKey
-DSC=OpenPlatformPkg/Platforms/Hisilicon/HiKey/HiKey.dsc
-ARCH=AARCH64
-UEFI_BIN=BL33_AP_UEFI.fd
-UEFI_IMAGE_DIR=HiKey
-BUILD_ATF=yes
-ATF_SPD=opteed
-TOS_BIN=tee.bin
-TOS_PLATFORM_FLAVOR=hikey
-BUILD_TOS=yes
-SCP_BIN=OpenPlatformPkg/Platforms/Hisilicon/HiKey/Binary/mcuimage.bin
-# Uncomment this to use UART0 as the EDK2 console
-#BUILDFLAGS=-DSERIAL_BASE=0xF8015000
-# Uncomment this to use UART0 as the ARM Trusted Firmware console
-#ATF_BUILDFLAGS=CONSOLE_BASE=PL011_UART0_BASE CRASH_CONSOLE_BASE=PL011_UART0_BASE
-# Uncomment this to use UART0 as the OP-TEE Trusted OS console
-#TOS_BUILDFLAGS=CFG_CONSOLE_UART=0
-
-[hikey960]
-LONGNAME=Hikey960
-DSC=OpenPlatformPkg/Platforms/Hisilicon/HiKey960/HiKey960.dsc
-ARCH=AARCH64
-UEFI_BIN=BL33_AP_UEFI.fd
-UEFI_IMAGE_DIR=HiKey960
-BUILD_ATF=yes
-ATF_SPD=opteed
-TOS_BIN=tee-pager.bin
-TOS_PLATFORM=hikey
-TOS_PLATFORM_FLAVOR=hikey960
-BUILD_TOS=yes
-SCP_BIN=OpenPlatformPkg/Platforms/Hisilicon/HiKey960/Binary/lpm3.img
-# Uncomment this to use UART5 as the EDK2 console for v1 hardware
-#BUILDFLAGS=-DSERIAL_BASE=0xFDF05000
-
-[xen64]
-LONGNAME=AArch64 Xen guest
-BUILDFLAGS=
-DSC=ArmVirtPkg/ArmVirtXen.dsc
-ARCH=AARCH64
-UEFI_BIN=XEN_EFI.fd
-UEFI_IMAGE_DIR=ArmVirtXen-AARCH64
-
-[aarch64-shell]
-LONGNAME=AArch64 EFI Shell
-BUILDFLAGS=-D INCLUDE_TFTP_COMMAND
-DSC=ShellPkg/ShellPkg.dsc
-ARCH=AARCH64
-
-[aarch64-shell-minimal]
-LONGNAME=AArch64 EFI Shell (Minimal)
-BUILDFLAGS=-D NO_SHELL_PROFILES
-DSC=ShellPkg/ShellPkg.dsc
-ARCH=AARCH64
-
-[arm-shell]
-LONGNAME=ARM EFI Shell
-BUILDFLAGS=-D INCLUDE_TFTP_COMMAND
-DSC=ShellPkg/ShellPkg.dsc
-ARCH=ARM
-
-[arm-shell-minimal]
-LONGNAME=ARM EFI Shell (Minimal)
-BUILDFLAGS=-D NO_SHELL_PROFILES
-DSC=ShellPkg/ShellPkg.dsc
-ARCH=ARM
-
-[d02]
-LONGNAME=Hisilicon D02
-DSC=OpenPlatformPkg/Platforms/Hisilicon/D02/Pv660D02.dsc
-ARCH=AARCH64
-UEFI_BIN=PV660D02.fd
-UEFI_IMAGE_DIR=Pv660D02
-
-[d03]
-LONGNAME=Hisilicon D03
-DSC=OpenPlatformPkg/Platforms/Hisilicon/D03/D03.dsc
-ARCH=AARCH64
-UEFI_BIN=D03.fd
-UEFI_IMAGE_DIR=D03
-
-[d05]
-LONGNAME=HiSilicon D05
-DSC=OpenPlatformPkg/Platforms/Hisilicon/D05/D05.dsc
-ARCH=AARCH64
-UEFI_BIN=D05.fd
-UEFI_IMAGE_DIR=D05
-
-[armada70x0]
-LONGNAME=Marvell Armada 70x0
-DSC=OpenPlatformPkg/Platforms/Marvell/Armada/Armada70x0.dsc
-ARCH=AARCH64
-
-[ovmfx64]
-LONGNAME=OVMF Qemu X64
-DSC=OvmfPkg/OvmfPkgX64.dsc
-ARCH=X64
-
-[hello]
-LONGNAME=EDK2 Hello World Example
-DSC=MdeModulePkg/MdeModulePkg.dsc
-INF=MdeModulePkg/Application/HelloWorld/HelloWorld.inf
-
-[chaoskey]
-LONGNAME=Altus Metrum ChaosKey Driver
-DSC=OptionRomPkg/OptionRomPkg.dsc
-INF=OpenPlatformPkg/Drivers/Usb/Misc/ChaosKeyDxe/ChaosKeyDxe.inf
diff --git a/uefi-tools/tos-build.sh b/uefi-tools/tos-build.sh
deleted file mode 100755
index a3bf421..0000000
--- a/uefi-tools/tos-build.sh
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/bin/bash
-#
-# Builds Trusted OS, mainly for ARM Trusted Firmware.
-# Calls $ATF_SPD-build.sh for the actual build of a specific Trusted OS.
-# Not intended to be called directly, invoked from uefi-build.sh.
-#
-# Board configuration is extracted from
-# parse-platforms.py and platforms.config.
-#
-
-. "$TOOLS_DIR"/common-functions
-
-function usage
-{
-	echo "usage:"
-	echo "tos-build.sh -e <EDK2 source directory> -t <UEFI build profile/toolchain> <platform>"
-	echo
-}
-
-function build_platform
-{
-	if [ X"$EDK2_DIR" = X"" ];then
-		echo "EDK2_DIR not set!" >&2
-		return 1
-	fi
-
-	if [ X"`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o build_tos`" = X"" ]; then
-		echo "Platform '$1' is not configured to build Trusted OS."
-		return 0
-	fi
-
-	#
-	# Build Trusted OS
-	#
-	ATF_SPD="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_spd`"
-	if [ -f $TOOLS_DIR/$ATF_SPD-build.sh ]; then
-		echo "Building $ATF_SPD Trusted OS"
-		if [ $VERBOSE -eq 1 ]; then
-			echo "$TOOLS_DIR/$ATF_SPD-build.sh -e "$EDK2_DIR" -t "$BUILD_PROFILE" $build"
-		fi
-		$TOOLS_DIR/$ATF_SPD-build.sh -e "$EDK2_DIR" -t "$BUILD_PROFILE" $build
-		return $?
-	else
-		echo "ERROR: missing Trusted OS build script."
-		echo "       Or build script not named $ATF_SPD-build.sh"
-		return 1
-	fi
-}
-
-build=
-
-if [ $# = 0 ]
-then
-	usage
-	exit 1
-else
-	while [ "$1" != "" ]; do
-		case $1 in
-			"-e" )
-				shift
-				EDK2_DIR="$1"
-				;;
-			"/h" | "/?" | "-?" | "-h" | "--help" )
-				usage
-				exit
-				;;
-			"-t" )
-				shift
-				BUILD_PROFILE="$1"
-				;;
-			* )
-				build="$1"
-				;;
-		esac
-		shift
-	done
-fi
-
-if [ X"$build" = X"" ]; then
-	echo "No platform specified!" >&2
-	echo
-	usage
-	exit 1
-fi
-
-build_platform $build
-exit $?
diff --git a/uefi-tools/uefi-build.sh b/uefi-tools/uefi-build.sh
deleted file mode 100755
index 7fec3d0..0000000
--- a/uefi-tools/uefi-build.sh
+++ /dev/null
@@ -1,398 +0,0 @@
-#!/bin/bash
-
-#
-# Board Configuration Section
-# ===========================
-#
-# Board configuration moved to parse-platforms.py and platforms.config.
-#
-# No need to edit below unless you are changing script functionality.
-#
-
-unset WORKSPACE EDK_TOOLS_DIR MAKEFLAGS
-
-TOOLS_DIR="`dirname $0`"
-export TOOLS_DIR
-. "$TOOLS_DIR"/common-functions
-PLATFORM_CONFIG=""
-VERBOSE=0
-ATF_DIR=
-TOS_DIR=
-TOOLCHAIN=
-OPENSSL_CONFIGURED=FALSE
-
-# Number of threads to use for build
-export NUM_THREADS=$((`getconf _NPROCESSORS_ONLN` + 1))
-
-function do_build
-{
-	PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o longname`"
-	PLATFORM_PREBUILD_CMDS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o prebuild_cmds`"
-	PLATFORM_BUILDFLAGS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o buildflags`"
-	PLATFORM_BUILDFLAGS="$PLATFORM_BUILDFLAGS ${EXTRA_OPTIONS[@]}"
-	PLATFORM_BUILDCMD="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o buildcmd`"
-	PLATFORM_DSC="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o dsc`"
-	PLATFORM_PACKAGES_PATH="$PWD"
-	COMPONENT_INF="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o inf`"
-
-	PLATFORM_ARCH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o arch`"
-	if [ -n "$PLATFORM_ARCH" ]; then
-		if [ -n "$DEFAULT_PLATFORM_ARCH" -a "$DEFAULT_PLATFORM_ARCH" != "$PLATFORM_ARCH" ]; then
-			echo "Command line specified architecture '$DEFAULT_PLATFORM_ARCH'" >&2
-			echo "differs from config file specified '$PLATFORM_ARCH'" >&2
-			return 1
-		fi
-	else
-		if [ ! -n "$DEFAULT_PLATFORM_ARCH" ]; then
-			echo "Unknown target architecture - aborting!" >&2
-			return 1
-		fi
-		PLATFORM_ARCH="$DEFAULT_PLATFORM_ARCH"
-	fi
-	TEMP_PACKAGES_PATH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o packages_path`"
-	if [ -n "$TEMP_PACKAGES_PATH" ]; then
-		IFS=:
-		for path in "$TEMP_PACKAGES_PATH"; do
-			case "$path" in
-				/*)
-					PLATFORM_PACKAGES_PATH="$PLATFORM_PACKAGES_PATH:$path"
-				;;
-				*)
-					PLATFORM_PACKAGES_PATH="$PLATFORM_PACKAGES_PATH:$PWD/$path"
-				;;
-		        esac
-		done
-		unset IFS
-	fi
-	if [ $VERBOSE -eq 1 ]; then
-		echo "Setting build parallellism to $NUM_THREADS processes\n"
-		echo "PLATFORM_NAME=$PLATFORM_NAME"
-		echo "PLATFORM_PREBUILD_CMDS=$PLATFORM_PREBUILD_CMDS"
-		echo "PLATFORM_BUILDFLAGS=$PLATFORM_BUILDFLAGS"
-		echo "PLATFORM_BUILDCMD=$PLATFORM_BUILDCMD"
-		echo "PLATFORM_DSC=$PLATFORM_DSC"
-		echo "PLATFORM_ARCH=$PLATFORM_ARCH"
-		echo "PLATFORM_PACKAGES_PATH=$PLATFORM_PACKAGES_PATH"
-	fi
-
-	if [[ "${PLATFORM_BUILDFLAGS}" =~ "SECURE_BOOT_ENABLE=TRUE" ]]; then
-	    import_openssl
-	fi
-
-	if [ -n "$CROSS_COMPILE_64" -a "$PLATFORM_ARCH" == "AARCH64" ]; then
-		TEMP_CROSS_COMPILE="$CROSS_COMPILE_64"
-	elif [ -n "$CROSS_COMPILE_32" -a "$PLATFORM_ARCH" == "ARM" ]; then
-		TEMP_CROSS_COMPILE="$CROSS_COMPILE_32"
-	else
-		set_cross_compile
-	fi
-
-	CROSS_COMPILE="$TEMP_CROSS_COMPILE"
-
-	echo "Building $PLATFORM_NAME - $PLATFORM_ARCH"
-	echo "CROSS_COMPILE=\"$TEMP_CROSS_COMPILE\""
-	echo "$board"_BUILDFLAGS="'$PLATFORM_BUILDFLAGS'"
-
-	if [ "$TARGETS" == "" ]; then
-		TARGETS=( RELEASE )
-	fi
-
-	case $TOOLCHAIN in
-		"gcc")
-			TOOLCHAIN=`get_gcc_version "$CROSS_COMPILE"gcc`
-			if [ $? -ne 0 ]; then
-				echo "${CROSS_COMPILE}gcc not found!" >&2
-				return 1
-			fi
-			;;
-		"clang")
-			TOOLCHAIN=`get_clang_version clang`
-			if [ $? -ne 0 ]; then
-				return 1
-			fi
-			;;
-	esac
-	export TOOLCHAIN
-	echo "TOOLCHAIN is ${TOOLCHAIN}"
-
-	export ${TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE
-	echo "Toolchain prefix: ${TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE"
-
-	export PACKAGES_PATH="$PLATFORM_PACKAGES_PATH"
-	for target in "${TARGETS[@]}" ; do
-		if [ X"$PLATFORM_PREBUILD_CMDS" != X"" ]; then
-			echo "Run pre build commands"
-			eval ${PLATFORM_PREBUILD_CMDS}
-		fi
-
-		if [ -n "$COMPONENT_INF" ]; then
-			# Build a standalone component
-			build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${TOOLCHAIN} -p "$PLATFORM_DSC" \
-				-m "$COMPONENT_INF" -b "$target" ${PLATFORM_BUILDFLAGS}
-		else
-			# Build a platform
-			build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${TOOLCHAIN} -p "$PLATFORM_DSC" \
-				-b "$target" ${PLATFORM_BUILDFLAGS}
-		fi
-
-		RESULT=$?
-		if [ $RESULT -eq 0 ]; then
-			if [ X"$TOS_DIR" != X"" ]; then
-				pushd $TOS_DIR >/dev/null
-				if [ $VERBOSE -eq 1 ]; then
-					echo "$TOOLS_DIR/tos-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board"
-				fi
-				$TOOLS_DIR/tos-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board
-				RESULT=$?
-				popd >/dev/null
-			fi
-		fi
-		if [ $RESULT -eq 0 ]; then
-			if [ X"$ATF_DIR" != X"" ]; then
-				pushd $ATF_DIR >/dev/null
-				if [ $VERBOSE -eq 1 ]; then
-					echo "$TOOLS_DIR/atf-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board"
-				fi
-				$TOOLS_DIR/atf-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board
-				RESULT=$?
-				popd >/dev/null
-			fi
-		fi
-		result_log $RESULT "$PLATFORM_NAME $target"
-	done
-	unset PACKAGES_PATH
-}
-
-
-function clearcache
-{
-  CONF_FILES="build_rule target tools_def"
-  if [ -z "$EDK_TOOLS_PATH" ]
-  then
-    TEMPLATE_PATH=./BaseTools/Conf/
-  else
-    TEMPLATE_PATH="$EDK_TOOLS_PATH/Conf/"
-  fi
-
-  for File in $CONF_FILES
-  do
-    TEMPLATE_FILE="$TEMPLATE_PATH/$File.template"
-    CACHE_FILE="Conf/$File.txt"
-    if [ -e "$CACHE_FILE" -a "$TEMPLATE_FILE" -nt "$CACHE_FILE" ]
-    then
-      echo "Removing outdated '$CACHE_FILE'."
-      rm "$CACHE_FILE"
-    fi
-  done
-
-  unset TEMPLATE_PATH TEMPLATE_FILE CACHE_FILE
-}
-
-
-function uefishell
-{
-	BUILD_ARCH=`uname -m`
-	case $BUILD_ARCH in
-		arm*)
-			ARCH=ARM
-			;;
-		aarch64)
-			ARCH=AARCH64
-			;;
-		*)
-			unset ARCH
-			;;
-	esac
-	export ARCH
-	export EDK_TOOLS_PATH=`pwd`/BaseTools
-	clearcache
-	. edksetup.sh BaseTools
-	if [ $VERBOSE -eq 1 ]; then
-		echo "Building BaseTools"
-	fi
-	make -C $EDK_TOOLS_PATH
-	if [ $? -ne 0 ]; then
-		echo " !!! UEFI BaseTools failed to build !!! " >&2
-		exit 1
-	fi
-}
-
-
-function usage
-{
-	echo "usage:"
-	echo -n "uefi-build.sh [-b DEBUG | RELEASE] [ all "
-	for board in "${boards[@]}" ; do
-	    echo -n "| $board "
-	done
-	echo "]"
-	printf "%8s\tbuild %s\n" "all" "all supported platforms"
-	for board in "${boards[@]}" ; do
-		PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o longname`"
-		printf "%8s\tbuild %s\n" "$board" "${PLATFORM_NAME}"
-	done
-}
-
-#
-# Since we do a command line validation on whether specified platforms exist or
-# not, do a first pass of command line to see if there is an explicit config
-# file there to read valid platforms from.
-#
-commandline=( "$@" )
-i=0
-for arg;
-do
-	if [ $arg == "-c" ]; then
-		FILE_ARG=${commandline[i + 1]}
-		if [ ! -f "$FILE_ARG" ]; then
-			echo "ERROR: configuration file '$FILE_ARG' not found" >&2
-			exit 1
-		fi
-		case "$FILE_ARG" in
-			/*)
-				PLATFORM_CONFIG="-c $FILE_ARG"
-			;;
-			*)
-				PLATFORM_CONFIG="-c `readlink -f \"$FILE_ARG\"`"
-			;;
-		esac
-		echo "Platform config file: '$FILE_ARG'"
-		export PLATFORM_CONFIG
-	fi
-	i=$(($i + 1))
-done
-
-builds=()
-boards=()
-boardlist="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG shortlist`"
-for board in $boardlist; do
-    boards=(${boards[@]} $board)
-done
-
-NUM_TARGETS=0
-
-while [ "$1" != "" ]; do
-	case $1 in
-		all )
-			builds=(${boards[@]})
-			NUM_TARGETS=$(($NUM_TARGETS + 1))
-			;;
-		"/h" | "/?" | "-?" | "-h" | "--help" )
-			usage
-			exit
-			;;
-		"-v" )
-			VERBOSE=1
-			;;
-		"-a" )
-			shift
-			ATF_DIR="$1"
-			;;
-		"-A" )
-			shift
-			DEFAULT_PLATFORM_ARCH="$1"
-			;;
-		"-c" )
-			# Already parsed above - skip this + option
-			shift
-			;;
-		"-s" )
-			shift
-			export TOS_DIR="$1"
-			;;
-		"-b" | "--build" )
-			shift
-			echo "Adding Build profile: $1"
-			TARGETS=( ${TARGETS[@]} $1 )
-			;;
-		"-D" )
-			shift
-			echo "Adding option: -D $1"
-			EXTRA_OPTIONS=( ${EXTRA_OPTIONS[@]} "-D" $1 )
-			;;
-		"-T" )
-			shift
-			echo "Setting toolchain to '$1'"
-			TOOLCHAIN="$1"
-			;;
-		"-1" )
-			NUM_THREADS=1
-			;;
-		* )
-			MATCH=0
-			for board in "${boards[@]}" ; do
-				if [ "$1" == $board ]; then
-					MATCH=1
-					builds=(${builds[@]} "$board")
-					break
-				fi
-			done
-
-			if [ $MATCH -eq 0 ]; then
-				echo "unknown arg $1"
-				usage
-				exit 1
-			fi
-			NUM_TARGETS=$(($NUM_TARGETS + 1))
-			;;
-	esac
-	shift
-done
-
-# If there were no args, use a menu to select a single board / all boards to build
-if [ $NUM_TARGETS -eq 0 ]
-then
-	read -p "$(
-			f=0
-			for board in "${boards[@]}" ; do
-					echo "$((++f)): $board"
-			done
-			echo $((++f)): all
-
-			echo -ne '> '
-	)" selection
-
-	if [ "$selection" -eq $((${#boards[@]} + 1)) ]; then
-		builds=(${boards[@]})
-	else
-		builds="${boards[$((selection-1))]}"
-	fi
-fi
-
-# Check to see if we are in a UEFI repository
-# refuse to continue if we aren't
-if [ ! -e BaseTools ]
-then
-	echo "ERROR: we aren't in the UEFI directory."
-	echo "       I can tell because I can't see the BaseTools directory"
-	exit 1
-fi
-
-EDK2_DIR="$PWD"
-export VERBOSE
-
-if [[ "${EXTRA_OPTIONS[@]}" != *"FIRMWARE_VER"* ]]; then
-	if test -d .git && head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
-		FIRMWARE_VER=`git rev-parse --short HEAD`
-		if ! git diff-index --quiet HEAD --; then
-			FIRMWARE_VER="${FIRMWARE_VER}-dirty"
-		fi
-		EXTRA_OPTIONS=( ${EXTRA_OPTIONS[@]} "-D" FIRMWARE_VER=$FIRMWARE_VER )
-		if [ $VERBOSE -eq 1 ]; then
-			echo "FIRMWARE_VER=$FIRMWARE_VER"
-			echo "EXTRA_OPTIONS=$EXTRA_OPTIONS"
-		fi
-	fi
-fi
-
-uefishell
-
-if [ X"$TOOLCHAIN" = X"" ]; then
-	TOOLCHAIN=gcc
-fi
-
-for board in "${builds[@]}" ; do
-	do_build
-done
-
-result_print
diff --git a/uefi-tools/uefi-build.sh.bash_completion b/uefi-tools/uefi-build.sh.bash_completion
deleted file mode 100644
index f0a5305..0000000
--- a/uefi-tools/uefi-build.sh.bash_completion
+++ /dev/null
@@ -1,24 +0,0 @@
-# bash completion for uefi-build.sh
-# copy this file to /etc/bash_completion.d/uefi-build.s
-
-have uefi-build.sh &&
-_uefi-build.sh()
-{
-    local cur prev
-
-    COMPREPLY=()
-    _get_comp_words_by_ref -n = cur
-
-    _expand || return 0
-
-    COMPREPLY=( $( compgen -W '--help -b --build RELEASE DEBUG a5 a9 tc1 tc2 panda origen arndale rtsm_a9x4 rtsm_a15x1 rtsm_a15mpcore rtsm_aarch64 beagle all' -- "$cur" ) )
-} &&
-complete -F _uefi-build.sh uefi-build.sh
-
-# Local variables:
-# mode: shell-script
-# sh-basic-offset: 4
-# sh-indent-comment: t
-# indent-tabs-mode: nil
-# End:
-# ex: ts=4 sw=4 et filetype=sh
